Google

星期五, 二月 29, 2008

Windows Live Messenger Library Beta Released

New: The Windows Live Messenger Library is a client-side library for building Web-based applications that integrate with Windows Live Messenger. With the Messenger Library, developers can build presence-enabled instant messaging applications that web site visitors can use to interact with each other as well as with Windows Live Messenger client users.

  • The IM Control enables web sites to show the presence of Windows Live Messenger users and let site visitors engage in IM conversations with site owners or representatives.
  • The Presence API is a an HTTP-based API that returns a Windows Live Messenger user's presence.

http://msdn2.microsoft.com/en-us/library/cc298458.aspx

标签:

D语言

Digital Mars C and C++ Compilers for Win32, Win16, DOS32 and DOS. Fastest compile/link times, powerful optimization technology, Design by Contract, complete library source, HTML browsable documentation, disassembler, librarian, resource compiler, make, etc., command line and GUI versions, tutorials, sample code, online updates, Standard Template Library, and much more.

D Programming Language spec

http://www.digitalmars.com/

标签: ,

沉积2+年,CodeBlocks升级!

Code::Blocks 8.02 has been released!
Thursday, 28 February 2008 18:34
Our long awaited release is finally here! Representing the hard work of 14+ developers for more 2+ years since our last official release (and many changes in the roadmap in between), it is finally made available to the general public.
For your convenience, we provide binaries for all platforms Code::Blocks supports:
Windows 2000 / XP / Vista
Linux (Ubuntu & Debian, 32 & 64 bits)
MacOSX 10.4+
Binaries for other Linux distros will be made available in the following days. So, without further ado, head over to the downloads section and get it while it's hot!
The Code::Blocks Team

http://www.codeblocks.org/

标签: , , ,

星期三, 二月 27, 2008

GIMP的中文使用说明书

请看:
http://docs.gimp.org/2.2/zh_CN/

标签:

星期五, 二月 22, 2008

Excel File Format Documentation

Excel File Format Documentation

  1. Microsoft Documentation
    • Download the Escher File Format Documentation
    • Read the Escher File Format Documentation online (this document is very very large!)
    • Pocket Excel File Format
    • Q147732 Records needed to make a BIFF 5 file excel can use
    • Q147942 DOCERR: Microsoft Excel Internal format table doc has errors
    • Q284441 DOC: Excel BIFF8 FORMAT Record Documentation Is Incomplete
    • Q284436 DOC: Excel BIFF8 Extended Rich String Formatting Run Is 4 Bytes
    • Q269168 HOWTO: Distinguish Between Excel 97 and Excel 2000/2002 Files
    • Q207475 DOC: Excel BIFF8 CONTINUE Record Information Is Incomplete
    • Q195237 LABEL Doc Error in MS Excel 97 Developer's Kit
    • Q184647 Xl97: BIFF Records Documentation Error in MS Excel 97 Developer's Kit
  2. 3rd Party Documentation

Source Code to deal with the Excel File Format

No matter what programming language you use, there is something here for you.
  1. For C programmers:
    • xlhtml - A c program for reading excel files.
    • xlreader Another c program for reading excel files
  2. For Java Programmers:
    • ExcelRead A java program for reading excel files
    • POI A java project to read and write Excel and OLE files
    • A java program to read and write the Pocket Excel file format.
  3. For Perl Programmers:
  4. For other languages:
http://chicago.sourceforge.net/devel/docs/excel/

标签: , , ,

雅虎采用开源搜索软件Hadoop 对抗谷歌

据国外媒体报道 日前,雅虎紧随谷歌步伐,再次调整搜索引擎,推出Hadoop服务。Hadoop可以处理大规模的分布式运算任务,它是基于谷歌MapReduce的一个开源软件和文件系统。其通过搜索引擎可以实现所有链接。

雅虎计划以Hadoop取代自己的软件产品,并在具有1万个核心处理器的Linux服务器上运行。与雅虎过去的软件相比,MapReduce的处理速度提高了34%.

Hadoop是阿帕奇软件基金会的一个项目。除了用于搜索服务外,它还可以解决大型的运算问题。比如,IBM在云运算中采用Hadoop.雅虎使用开源软件对抗谷歌,不失为明智之举,特别是这种软件优于自己以前的产品。

http://news.csdn.net/n/20080222/113759.html
http://hadoop.apache.org/core/

标签:

雅奇MIS: 坚持15年的国产开发平台

一套编程软件,能让普通的办公管理人员,以及会使用计算机的 人等,快速地、自主地开发出适合自己的业务管理软件:新用户从“0”开始,5分钟后即能了解编程原理、15分钟即会基本编程、30分钟后可完成第一个完全 自主开发的应用软件。因为,它既没有复杂的规则和语法,几乎只使用鼠标就可完成高效快捷的无代码编程。这就是雅奇MIS,一个图示化编程工具。

http://news.csdn.net/n/20080130/113233.html

标签:

星期三, 二月 13, 2008

delphi实现ado的高级功能

ADO是Microsoft存取通用数据源的标准引擎。ADO通过封装OLE DB而能够存取不同类型的数据,让应用程序能很方便地通过统一的接口处理各种数据库。ADO由一组COM对象组成,每一个不同的原生ADO对象负责不同的工作。下面,向大家介绍如何使用原生ADO对象的动态属性来实现ADO的高级功能。www.sq120.com推荐文章

  ADO原生对象关系图:
  Connection
  Errors→Error
  Command→Parameters→Parameter
  RecordSet→Fields→Field
一、存取原生ADO对象
   Delphi中的ADO组件页中的组件为我们通过ADO技术访问数据库提供了方便。这些组件封装了原生的ADO对象。虽然我们利用ADO组件页中的组件 也能编写出有效率的数据库程序,但是ADO中的一些属性和方法仍然是ADOExpress组件没有封装进去的,而此时,需要使用这些没有封装的属性和方 法,必须还得通过存取原生的ADO对象来使用这些属性和方法。
  在ADO组件中,每个组件都有一个属性让程序员通过它来存取它所封装的原生ADO对象。下面我们用表1来说明ADO组件页中ADO组件封装原生ADO对象的属性:
  在程序中访问ADO组件封装的原生ADO对象,例如:
  Var
  MyRS :_RecordSet;
  MyRS :=ADODataSet1.RecordSet;
  以上这句就是访问组件封装的原生ADO对象RecordSet。


 
二、存取原生ADO对象的动态属性
  当我们用ADO组件编写针对特定数据库的应用程序时,ADO驱动程序会将特定数据库所能提供的功能存储在动态属性之中。在ADO模型中,每一个原生AD
  O对象都有一组动态属性。
  注意:在Delphi中,只能通过原生的ADO对象来存取动态属性。
  原生的ADO对象的动态属性集合存储在名为Properties的数组结构中,Properties数组中的每一个数组元素Property就对应一个特定的动态属性。因此,访问原生ADO对象的动态属性的基本步骤是:
  1. 通过ADO组件的属性访问其封装的原生的ADO对象;
  2. 利用原生的ADO对象访问其Properties动态属性集合;
  3. 在Properties动态属性集合中访问Property动态属性;
  4. 存取Property动态属性的值,实现ADO组件未封装的功能。
  Delphi为我们访问动态属性集合Properties提供了几个方便的接口函数供我们调用:
  Function Get_Item(Index : OleV
  ariant) :Property; SafeCall;//根据动态属性的索引值或名称获取动态属性
  Property Item[Index :OleVariant
  ] :Property Read Get_Item;//根据动态属性在集合中的索引值来获取动态属性
  Delphi也提供了以下的属性来方便地访问动态属性Propery的名称和值:
  Name 动态属性的名称
  Value 动态属性的值
  为了说明这些原理,我们用一个简单的例子来说明。这个例子中,程序运行后点击按钮,在Memo中就会显示原生的ADO对象RecordSet的所有动态属性。
  1. 建立一个新的工程,保存为Project1.dpr;
  2. 在主窗体上放置如下组件:
  TAdoConnection、TAdDataSet、TMemo、TButton
  3. 将TAdoConnection的Conne
  ctionString属性连接到SQL SERVE
  R 数据库的Pubs数据库;
  4. 设置TAdoDataSet的Connecti
  on属性为上一步中的TAdoConnecti
  on组件;
  5. 编写按钮的Button1Click事件处理函数代码如下:
  procedure TForm1.Button1Click(S
  ender: TObject);
  Var
  i :Integer;
  MyPty :Property_;
  MyPties :Properties;
  MyRS :_RecordSet;
  begin
  AdoDataSet1.Open;
  MyRS :=AdoDataSet1.RecordSet; //获取原生的ADO对象赋值给MyRS
  MyPties :=MyRS.Properties; //获取原生ADO对象的动态属性集合Prop
  erties赋值给MyPties
  For i :=0 to MyPties.Count-1 do //循环取得动态属性集合Properties中的每一个动态属性
  begin
  MyPty :=MyPties.Item[i]; //动态属性集合MyPites的Item属性根据索引值取得每一个动态属性赋值给MyPty
  Memo1.Lines.Add(MyPty.Name); //动态属性MyPty的Name属性表示该动态属性的名字,将动态属性的名字加入到Memo1列表中。
  end;
  end;

三、利用原生ADO对象实现ADO高级功能
  我们利用 ADO编写的数据库应用程序,总会涉及到数据更新的情况。当利用ADO将数据更新回数据库时,ADO必须依据一定的条件从数据库中找到将要被更新的原始记 录,然后用更新的字段值更新回数据库。ADO默认的更新条件是这样的,依据关键字段的值与被修改的字段的原始值在数据表中查找这样的记录,如果找到这条记 录,则用更新的字段值更新回数据库。这个所依据的更新条件也是原生ADO对象的动态属性来控制的,我们可以在程序运行中存取这个动态属性,达到修改更新条 件的目的。控制更新条件的动态属性是通过原生的ADO对象的RecordSet对象的UpdateCriteria动态属性来实现的。 UpdateCriteria动态属性取值的意义,见表2。


 
  其中adCriteriaUpCols是ADO的默认设置。在一个多人使用的系统中,很可能同一笔数据在相同时间被不同的用户修改,这时较好的设置UpdateCriteria的值,能极大程度地控制是否能成功地将数据更新回数据。例如:一个表有A、B、C三个字段,A是关键字段。用户甲更新了一条记录的B字段值,而此时用户乙更新了同一条记录的B字段的值,假设此时UpdateCriteria动态属性的值为adCriteria
  Key,用户乙的修改结果就会把用户甲的修改所覆盖。如果UpdateCriteria动态属性的值为adCriteriaUpCols,此时,用户乙的修改就不会成功,因为对字段B的值在数据库找不到原始记录。
  为了说明这个原理,我们用一个简单的例子来说明。这个例子中,我们修改原生ADO对象RecordSet的Update
  Criteria动态属性的值(默认为adCriteriaUpCols)为adCriteri
  aKey,即把ADO的更新条件设置为依据关键字段的值在数据表中寻找原始记录(如图)。


 
  1. 新建一个工程,命名为Project1.dpr。
  2. 在主窗体中放置如下组件:
  TAdoConnection:连接到SQL SERVER数据库服务器。
  TAdoTable:设置其Connection属性为上一步中的TAd
  oConnection组件,并设置TableName为数据库中一个表名。
  TDataSource:设置其DataSet属性为上一步的TAd
  oTable组件。
  TDBNavigator 、TDBGr
  id:设置其DataSource属性为上一步的TDataSource组件。
  3. 在主窗体的OnCreate事件处理函数中编写代码,来修改原生ADO对象的Upd
  ateCriteria动态属性值为adCr
  iteriaKey,访问原生ADO对象的动态属性的步骤见前面所述。代码如下:
  procedure TForm1.FormCreate(Sender: TObject);
  Var
  MyPty :Property_;
  MyPties :Properties;
  MyRS :_RecordSet;
  begin
  AdoTable1.Open; //打开数据集
  MyRS :=AdoTable1.RecordSet; //获取TAdoTable组件封装的原生的ADO对象RecordSet
  MyPties :=MyRS.Properties; //通过原生ADO对象获取Properties动态属性集合
  MyPty :=MyPties.Get_Item('Update Criteria'); //通过动态属性集合的Get_Item函数获取其中的动态属性Upda
  teCriteria的Value值。
  MyPty.Value :=adCriteriaKey;
  //注意:在程序中引用adCriteriaKey常量,必须在Uses子句中包括ADOInt单元。
  //如果不想另外引用ADOInt单元,可以直接用adCriteriaKe
  y代表的值0作为属性值赋值。
  //AdoTable1.Recordset.Properties.Get_Item('Update Criteria'
  ).Value :=adCriteriaKey; 这一句的功能和上面各句是一样的。
  End;
  ADO比BDE功能有了很大的提高。ADO对多表连接的查询结果就具有修改的能力,而BDE不能对多表连接的查询结果进行修改更新的操作,而必须依靠TUpdateSql组件来实现这个功能。ADO能自动地判断被修改的字段所属的表,然后分别更新回不同的表中。但是在对表连 接的查询结果作出删除操作时,ADO总会把两个表中的数据都删除掉。例如有一个员工表,一个定单表,将这两个表通过员工编号连接起来,作出删除操作时,同 时会将员工表中的数据,与定单表中的数据删除掉,这也许是我们不希望看到的,假设我们只希望删除掉一个员工接到的其中一笔定单记录,而不愿意把这个员工的 记录也删除掉,这个时候我们应该怎么办呢? 在ADO中的原生ADO对象的Unique Table动态属性负责控制这个功能,设置Unique Table的值为多表连接中某一个数据表的名称,就能实现在多表连接中删除指定表的记录。
  在这个例子中,我们通过原生ADO对象的动态属性Unique Table,实现在多表连接的结果集中,删除指定表中的记录。这里假设我们只希望在删除数据时,只删除DetailTable数据表中的记录,而希望保留MainTable表中的记录,步骤如下:
  1. 新建一个工程,命名为Project2.dpr。
  2. 在主窗体中放置如下的组件:
  TAdoConnection:连接到SQL SERVER的数据库
  TAdoDataSet:设置其Connection属性为上一步中的TAdoConnection组件,并设置其CommandText属性为两个表连接查询的SQL语句,比如:
  select a.EmpId, a.EmpName, a.EmpOffice, b.OrderId,b.OrderName from MainTable a join DetailTable b on a.Emp
  Id=b.EmpId
  TDataSource:设置其DataSet属性为上一步的TAdoDa
  taSet组件。
  TDBNavigator 、TDBGrid:设置其DataSource属性为上一步的TDataSource组件。
  3. 在主窗体的OnCreate事件处理函数中编写代码:
  procedure TForm1.FormCreate(Sender: TObject);
  Var
  MyPty :Property_;
  MyPties :Properties;
  MyRS :_RecordSet;
  begin
  AdoTable1.Open; //打开数据集
  MyRS :=AdoDataSet1.RecordSet; //获取TAdoDataSet1组件封装的原生的ADO对象RecordSet
  MyPties :=MyRS.Properties; //通过原生ADO对象获取Properties动态属性集合
  MyPty :=MyPties.Get_Item('Unique Table').Value := 'Detail
  Table'; //通过动态属性集合的Get_Item函数获取其中的动态属性Unique Table的Value值。
  //AdoDataSet1.Recordset.Properties.Get_Item('Unique Table'
  ).Value := 'DetailTable'; 这一句的功能和上面各句是一样的。
  End;

http://www.sq120.com/Get/jiqiao/195837523_2.htm

标签: ,

Delphi下的ADO

Delphi下的ADO

ADO的精髓在于利用简单的COM指令来快速方便的访问ODBC数据源,微软的表格、列表框等ActiveX控件使得用户可以简便的利用ADO工作;然而,本文中笔者仅仅向您展示了如何利用程序访问数据库,将不采用任何可视化数据控件。
本文将向您展示如何利用Variant或interfaces访问和修改ADO数据库,示例程序非常简单,可运行于Delphi 3或4。
安装和访问一个ADO数据库。
示例程序的代码不足150行,然而运行本程序必须首先安装ADO以及设置ODBC数据源。
ADO是一组COM组件的集合,允许程序员利用利用少量的简单代码访问数据库。
ADO通常和OLEDB、Universal Data Access以及Microsoft Data Access Components(MDAC)联系在一起。OLEDB产生较ADO为早,是后期各种技术的基础。
如果你已经安装了ADO,你会在你的计算机中发现ADODB.DLL或者是MSADO15.DLL,这些文件中包含了一个类库,其中包括了利用ADO编程 所需的全部接口和常量。在Delphi中,选择菜单Project | Import Type Library,选择以上的DLL文件,然后确定,系统生成了一个基于ADODB.DLL的ADODB_TLB.Pas文件,这个文件中包含了所有 Delphi ADO编程所需的声明。
最后一步的准备工作就是将Delphi演示数据库中的Clients.DBF设置为ODBC系统DSN,其别名为DBDemosDBase,驱动程序为Dbase 5。
以下程序清单同时利用Variants和Interfaces访问ADO:
unit Main;
{---------------------------------------------------------------------
Created Jan 5, 1999. Copyright (c) 1999 by Charlie Calvert
----------------------------------------------------------------------}
interface


uses Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ComObj, Grids, ADODB_TLB, ExtCtrls;


const
SELECTSTRING = 'SELECT * FROM Clients.dbf';
DSNSTRING = 'DBDemosDBase';
type TForm1 = class(TForm)
StringGrid1: TStringGrid;
Panel1: TPanel;
VariantBtn: TButton;
InterfaceBtn: TButton;
UpdateBtn: TButton;
Edit1: TEdit;
procedure VariantBtnClick(Sender: TObject);
procedure InterfaceBtnClick(Sender: TObject);
procedure UpdateBtnClick(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);

private
procedure Display(RecordSet: _RecordSet); { Private declarations }
public { Public declarations }
end;
var Form1: TForm1;implementation
uses
ActiveX;
{$R *.DFM}
procedure TForm1.Display(RecordSet: _RecordSet);
var
Y, i: Integer;
begin
Y := 1;
repeat
for i := 0 to 6 do
StringGrid1.Cells[i, Y] := RecordSet.Fields[i].Value;
RecordSet.Move(1, EmptyParam);
Inc(Y);
until RecordSet.EOF;
end;
procedure TForm1.InterfaceBtnClick(Sender: TObject);
var RecordSet: _RecordSet;
DSN: string;
begin
// 生成空的recordset object
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,
CLSCTX_ALL, IID__RecordSet, RecordSet));
DSN := 'dsn=' + DSNSTRING;
// 填写数据
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,
adLockReadOnly, adCmdUnspecified);
// 显示数据
Display(RecordSet);
UpdateBtn.Enabled := True;
end;
procedure TForm1.UpdateBtnClick(Sender: TObject);
var RecordSet: _RecordSet;
DSN: string;
begin
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,
CLSCTX_ALL, IID__RecordSet, RecordSet));
DSN := 'dsn=' + DSNSTRING;
// Fill the recordset
RecordSet.Open(SELECTSTRING, DSN, adOpenDynamic,
adLockOptimistic, adCmdUnspecified);
// 修改
RecordSet.Move(StringGrid1.Row - 1, EmptyParam);
RecordSet.Fields[StringGrid1.Col].Value := Edit1.Text;
RecordSet.Update(EmptyParam, EmptyParam);
RecordSet.MoveFirst;
Display(RecordSet);
end;
procedure TForm1.VariantBtnClick(Sender: TObject);
var
RecordSet: OleVariant;
Y, i: Integer;
begin
// Create an empty recordset object
RecordSet := CreateOleObject('ADODB.Recordset');
// Fill the recordset
RecordSet.Open(SELECTSTRING, DSNSTRING);
// Display the data
Y := 1;
repeat
for i := 0 to 6 do
StringGrid1.Cells[i, Y] := RecordSet.Fields[i].Value;
RecordSet.Move(1);
Inc(Y);
until RecordSet.EOF;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Edit1.Text := StringGrid1.Cells[ACOl, ARow];
end;
end.
这个程序有三个按钮,一个StringGrid以及一个编辑框,第一个按钮利用以Variants连接的ADO填充表格,第二个则利用Inteface进行连接。
第三个按钮用于修改数据,当用户单击StringGrid的单元格时,单元格中的数据会显示于编辑框中,可以修改编辑框中的数据,然后单击这个按钮,将会修改这个单元格以及数据库中的数据。
ADO中含有许多不同的对象,本文将集中讲述RecordSet和Fields这两个对象。
可以用如下的代码生成一个RecordSet的实例:
var
RecordSet: OleVariant;
begin
RecordSet := CreateOleObject('ADODB.Recordset');
... // Code omitted here
end;
CreateOleObject声明于ComObj.Pas中。它是ActiveX.Pas中的核心函数CoCreateInstance的一个简单包装。
要打开数据库,可利用以下代码:
const
SELECTSTRING = 'SELECT * FROM Clients.dbf';
DSNSTRING = 'DBDemosDBase';

begin
RecordSet := CreateOleObject('ADODB.Recordset');
RecordSet.Open(SELECTSTRING, DSNSTRING);
.. // Code omitted here
end;
Open方法有很多参数,但是在这个程序中我们只处理其中的两个。第一个是我们要执行的SQL语句,第二个是我们要操作的数据库。
当打开一个数据集时,数据集游标位于第一个记录,可以用下面的代码访问这个记录:

MyString := RecordSet.Fields[0].Value;
MyString := RecordSet.Fields[1].Value;

要移动游标,可以用RecordSet对象的Move方法:
RecordSet.Move(1);

利用Interface访问ADO:

利用Interface访问ADO的步骤同从前的例子大致相同:

procedure TForm1.InterfaceBtnClick(Sender: TObject);
var RecordSet: _RecordSet;
DSN: string;
begin
// Create an empty recordset object
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,
CLSCTX_ALL, IID__RecordSet, RecordSet));
DSN := 'dsn=' + DSNSTRING;
// Fill the recordset
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,
adLockReadOnly, adCmdUnspecified);
// Display the data
Display(RecordSet);
UpdateBtn.Enabled := True;
end;

同前一节的代码不同,这些代码必须包含ADODB_TLB.PAS。
这一段代码用ADODB_TLB.PAS中声明的_RecordSet代替了Variants。
这 里直接调用了CoCreateInstance来生成对象的实例。第一个参数传递了声明于ADODB_TLB.PAS中的常量 CLASS_RecordSet,它代表RecordSet的Class ID,第四个参数为IID__RecordSet,也是声明于ADODB_TLB.PAS中的,注意,它带有两条下划线!最后一个参数是我希望建立的实 例。
当调用recordSet.Open的时候,应该穿第五个参数。
const
SELECTSTRING = 'SELECT * FROM Clients.dbf';
DSNSTRING = 'DBDemosDBase';

begin
.. // Code omitted
DSN := 'dsn=' + DSNSTRING;
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,
adLockReadOnly, adCmdUnspecified);
.. // Code omitted
end;
在前一节的例子中,可以只传递两个参数,这是因为Variants允许忽略参数,这时采用缺省值。当采用Interfaces时,则必须明确的定义参数。如果希望采用缺省值,则可以向下面这样调用函数:
RecordSet.Open(SelectString, DSN, EmptyParam, EmptyParam, EmptyParam);
在这里我们使用了EmptyParam这样一个Variant,它被声明于System.Pas,这些参数将采用缺省值。上面的例子中我用了声明于ADODB_TLB.PAS中的真正的缺省值。此类问题可参考Data Access SDK中的相关文件。
打开数据集以后,就可以用同上一节相同的方法显示数据。唯一的不同就是RecordSet.Move方法要有两个参数。
procedure TForm1.Display(RecordSet: _RecordSet);
var Y, i: Integer;
begin
Y := 1;
Repeat
for i := 0 to 6 do
StringGrid1.Cells[i, Y] := RecordSet.Fields[i].Value;
RecordSet.Move(1, EmptyParam);
Inc(Y);
until RecordSet.EOF;
end;

修改数据
当修改数据时,不能用打开数据集时使用的缺省值,而是应该传递以下的参数:
const
adOpenDynamic = $00000002;
adLockOptimistic = $00000003;
adCmdUnspecified = $FFFFFFFF;
begin
.. // Call CoCreateInstance
DSN := 'dsn=' + DSNSTRING;
RecordSet.Open(SELECTSTRING, DSN, adOpenDynamic, adLockOptimistic,
adCmdUnspecified);
.. // Code ommitted here
end;

无论你用的是Variants还是Interfaces,这段代码都将正常工作。
当你的数据集以可读写的方式打开时,如adLockOptimistic方式,就可以修改数据库的内容了:
RecordSet.Fields[0].Value := Edit1.Text;
RecordSet.Update(EmptyParam, EmptyParam);
这段代码可以修改当前记录的内容。当然也可以利用字段数组以及Move方法修改任何记录。如果用的是Variants方式,可以不传递任何参数。
在例子中,我采用了一种简单的方法来编辑表中的字段。如果用户在某一个字段商单击,其数值会显示于编辑框中:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Edit1.Text := StringGrid1.Cells[ACOl, ARow];
end;

用于更新数据的代码如下:
RecordSet.Move(StringGrid1.Row - 1, EmptyParam);
RecordSet.Fields[StringGrid1.Col].Value := Edit1.Text;
RecordSet.Update(EmptyParam, EmptyParam);

第一行将数据集游标移动到表格当前行,第二行修改数据,第三行提交修改。
最后一步将把数据集游标移动到第一条记录,然后调用相同的过程显示修改后的数据库。
RecordSet.MoveFirst;
Display(RecordSet);
////////////////////////////////////////////////////
Delphi 5 ADO

关键词:Delphi - MIS

ADO
Universal Data Access (UDA)是微软公司策畋一部分,提供了快速访问各种数据库的能力,UDA提供了一种不受限制的能力,通过易用的API接口访问各种数据源,当然,这需要 与其兼容的驱动程序,类似Delphi的BDE,这项技术能在一个程序中从多样的数据源中轻易的访问到数据。UDA用MDAC来实现,而MDAC则包括 Active Data Objects(ADO),Open Database Connectivity(ODBC)与OLE DB.
ADO是MDAC的应用程序设计接口,OLE DB则是系统级的接口,定义了一套COM接口,提供了从关联数据库及文件系统的数据访问能力,ODBC为了向后兼容也包含在MDAC中,但是在将来,他要 被OLE DB所替代,现在对于ODBC,开发者通过ADO来使用ODBC驱动,尽管如此,OLE DB已经可用于Microsoft Access,Microsoft SQL以及Oracle.
ADO另外的一个重要的优势是将被内置在微软将的所有操作系统不,包括Windows 2000,这就意味着虽然现在为了使用ADO来访问数据库而不得不在每一台PC中安装ADO,而将来这种安装技术将消失。如果想进一步学习UDA及 ADO,可以访问微软的数据访问主页http://www.microsoft.com/data/default.htm,从这个主页上,不但可以载到 ADOredistributable,用他可以在windows95/98/nt安装ADO,也能得到MDAC的SDK,包含了完整的文档以及需要开发 自己的OLE DB 的所有工具,此外,SDK也包含ADO的发行版。
用ADO需要的每一件事,都被制作在Delphi 5的安装盘上,如果安装MDAC,进行MDAC目录,执行程序MDAC_TYP.EXE即可.由于安装程序仅为一个文件,所以安装MDAC也变得非常简 单。如果自己开发的应用程序需要安装MDAC,则此安装程序还可作为自己开发应用的安装程序的一部分,为了去除它的安装提示信息,需要在自制安装程序时使 用如下的命令行:mdac_typ.exe /q:a /c:"setup.exe /qt"
对于更多的安装MDAC的信息,象文件列表及依赖关系,可以看MDAC SDK文档。

使用ADOConnection 和 ADODataSet控件
D5提供了一套新的控件以支持ADO,并且能够轻易的转换现有的应用到ADO,要建立一个ADO应用,首先需要在form或data module中放一个ADOConnection控件,这与BDE 的Database 控件差不多,他允许通过ConnectionString属性定义与数据库的联接,如果想手工建立这个联接串可不是一件容易的事,这个串是由';'隔开的 一系列参数,这些参数很容易就能超过150个字符,幸运是是,微软提供了一个联接串编辑器,使做起这件事来变得简单。为了打开这个编辑器,就可完成这项工 作。爽的很。
在这个编辑器中,可以以两种方式之一来选择与数据源的建立,其一是用联接文件的方式,另一种则是建立联接串的形式,默认的情况下是使用联接串,选择 build按钮,出现数据联接属性设置对话框,在provider页,可以选择使用的驱动程式,当确定使用的驱动程序后,可以选择下一步,确定具体要联接 的数据库,需要注意的是,选择不同的驱动程序,在这一页需要确定的参数是不同的。当确定这里的各个参数后,可以用测试联接按钮来测试数据库是否可以联接, 从而确定给定的联接参数是否正确。在这里,我们仅以Microsort Jet 4.0为例子,联接本地的一个Acess表。
现在,当完成联接串后,就可以设置Connected为True,使ADOConnection与数据库真正的联接。此时,可以放置ADODataset 控件,实际上,只有ADODataset才是真正与数据一起工作的,通过ADODataset,可以直接与一个表进行联接,也可以执行SQL语句,还可以 执行存储过程(哇,好利害)。使用ADODataset的第一步,就是设置Connection,确定其使用那一个ADOConnection,接下来, 要处理两个有关联的属性:CommandType与CommandText,由于CommandText是由commandtype决定的,所以要先设置 commandType,正是由他来决定DataSet怎样与数据库工作,用表,SQL还是存储过程。而后CommandText自然就容易设置,不用多 说。当这两个参数确定下来,余下的工作就如同原来的使用BDE访问数据库的工作差不多,使用DataSource与ADODataSet联接,与就是用 DBGrid等与DataSource联接,现在,利用ADO,可以访问到数据了!

http://www.delphichm.com/html/Database/aaaafsdfasdf/20070622/40.html

标签: ,

星期六, 二月 02, 2008

如何能得到一个字段的是否是not null属性的?又如何得到它的默认值?

1、一个字段能否为空与它有无缺省值没有必然联系。只是一般而言,有缺省值的字段多半是不能为空的。
2、请参考TADOConnection.GetFieldNames。
注意在使用OpenSchma时,保存缺省值的那一列列名叫做COLUMN_DEFAULT,IS_NULLABLE标明它是否可以为空。 DataType指示它的数据类型(是数字型的,有个对应关系)。其它诸如TABLE_NAME,COLUMN_NAME等列分别表示相应的意思。很容易懂的,你可以用个DBGRID把结果显示出来。

http://topic.csdn.net/t/20030524/10/1827297.html
辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger