作为一个ASP爱好者笔者经常在ASP页面中使用ADO对象操作ODBC数据库觉得用ASP创建Web应用系统确实是挺方便的虽然在编程生涯中笔者更喜欢Borland系列产品对微软产品有点排斥但对ASP却是例外某天忽然想到ADO对象是一个标准OLE对象如果在Delphi应用程序中能利用ADO操作数据库应该挺不错尤其在用DELPHI做网络数据库应用程序时如果所在的Web站点是WINNT站点并且支持ASP页面那就可以用ADO对象访问ODBC数据库而不用把那么大的BDE再上载到站点上去这样就可充分利用DELPHI和ASP的编程优势做出更好的ISAPI/NSAPI/CGI经过编程和测试在Delphi中可以成功地用ADO对象存取ODBC数据库现将本人的使用经验写出来与大家共享让我们多一个访问ODBC数据库的方法
在位的Delphi中可以声明一个variant变量(如AVariant)然后通过CreateOleObject创建一个OLE对象如AVariant:=CreateOleObject (ADODBConnection)可以获得一个数据库连接对象的实例然后就可以利用该对象的方法和属性来操作ODBC数据库了
下面简单介绍一下访问ODBC数据库所用到的ADO对象及其方法和属性
数据库连接对象(ADODB Connection)
该对象用于与ODBC数据库建立连接所有对数据库的操作均通过该连接进行
数据库连接对象ADODB Connection的作用象Delphi中的TDatabase对象
建立一个连接对象的方法为(AConnection为Variant类型变量)
AConnection:=CreateOleObject(A DODBConnection)
用于建立连接的方法为Open使用语法为(以对象AConnection为例)
AConnectionOpen( ConnectionString UserId Password )
三个参数均为字符串类型其中UserId和Password为用户名称和用户密码用于访问数据库使用时可以省略因为在ConnectionString同样可以指定用户名称和用户密码ConnectionString是用来说明ODBC数据源信息的字符串其格式为
Provider=ProviderName; DSN=DSNName; DRIVER=driver; SERVER=server; DATABASE=database; UID=user; PWD=password
其中
Provider数据提供者默认状态下为MSDASQL为微软OLEDB通常省略
DSN要打开的数据库对应的OBDC系统数据源(DSN)是可选参数
DRIVER要打开的数据库所用的驱动程序名称如Access对应Microsoft Access Driver (*mdb)是可选参数
SERVER要打开的数据库所在的服务器名称本机可用(local)是可选参数
DATABASE要打开的数据库名称是可选参数
UID用户名称用来访问数据库是可选参数
PWD用户密码用来访问数据库是可选参数
以上参数均为可选参数但必须提供足够的信息来描述一个系统数据源
假如已经定义了一个ODBC的系统DSN名称为MyDsn那么就可用以下语句建立一个数据库连接
AConnectionOpen(DSN=MyDsn);
为了防止DSN不存在或其设置被他人修改时造成应用程序运行错误可以用ADODBConnection 创建一个临时ODBC数据源这样可以保证我们使用的系统DSN的参数设置是正确的下面的语句可以创建一个临时ODBC系统DSN对应一个ACCESS数据库路径为C:\Inetpub\ wwwroot\ testmdbAConnectionopen(Driver= {Microsoft Access Driver (*mdb)};DBQ=C:\inetpub \wwwroot\testmdb)
建立一个ADODBConnection后如果不需要返回操作结果(如删除修改更新等操作)就可以对数据库进行正常的SQL操作了此时应用ADODBConnection的另外一个方法Execute使用语法为
AConnectionExecute( strSQL );
其中strSQL为执行操作的SQL语句如删除操作可以为delete from wfjcommu用AConnectionClose关闭一个数据库连接
数据集对象(ADODB RecordSet)
如果要执行查询操作并返回查询结果或者要更方便地操作数据表那就需要用到数据集对象了
数据集对象ADODBRecordSet的作用象Delphi中的TTable或TQuery对象
建立一个数据集对象的方法为(ARecordSet为Variant类型变量)
ARecordSet:=CreateOleObject (ADODBRecordSet)
从数据表取得数据的方法为Open方法具体使用方法为
ARecordSetOpen( strCommandActiveConnectionint CursorTypeintLockType intCommandType );
其中
strCommand字符串为命令参数可以是一个Table名称可以是一个SQL语句也可以是一个服务器上的存储过程(StoredProc)名称具体需要后面的参数intCommandType来指定
ActiveConnection要使用的数据库连接是一个ADODB Connection对象
intCursorType长整数数据集的Cursor类型可选参数请参见程序中注释
intLockType长整数对数据表的加锁类型可选参数请参见程序中注释
intCommandType长整数命令参数的类型用来指明strCommand的作用可以指定strCommand为命令(如SQL语句)或数据表(TTable)或储存过程(StoredProc)可选参数请参见程序中注释
如执行一个SQL查询可以采用如下语句
ARecordSetOpen(Select * from wfjcommuadOpenStaticad LockOptimisticadCmdText);
其它常见属性和方法与TTable和TQuery相比较如下(具体请见ASP帮助文件)
eofbof: eofbof.MoveFirst MoveLast: First LastMovePrevious MoveNext: Prior NextMove: MoveByAddNew: appendUpdate: PostClose: close
Delete加Updatedelete所有对数据表的修改均须用Update使操作有效这与Delphi不同
Fields[FieldNo]: Fields[FieldNo]
Fields[FieldName]: FieldByName(FieldName)
其他常见对象(与Delphi对应的对象)
ADODBField: TField ADODBParameter: TPara ADODBError: EDBEngineError
ADODBCommand无 ADODBProperty无
下面来看一个应用例子
procedure TFormButtonClick(Sender: TObject);
{*****************************************************
用ADO操作ODBC数据库
本程序中将创建一个临时的ODBC系统数据源指向一个MsAccess数据库然后对其中的数据表进行显示增加修改删除和查询操作
注意请在Uses语句中包含ComObj单元
*****************************************************}
const{一些常量声明详细请参见adovbsinc}
{ CommandType的常量说明 }
adCmdUnknown = ;//未知需要系统来判断速度慢为缺省值
adCmdText = ;//命令语句如SQL语句
adCmdTable = ;//数据表名称
adCmdStoredProc = ;//存储过程名称
{ CursorType的常量说明 }
adOpenForwardOnly = ;//只能由前向后单向访问为缺省值
adOpenKeyset = ;//可见其他用户对数据的修改但对其它用户的增加和删除不可见
adOpenDynamic = ;//其他用户对数据的增加修改和删除均可见
adOpenStatic = ;//其他用户对数据的增加修改和删除均不可见
{ LockType的常量说明 }
adLockReadOnly = ;//只读为缺省值
adLockPessimistic = ;//在修改时按单个记录锁定
adLockOptimistic = ;//在修改后更新时按单个记录锁定
adLockBatchOptimistic = ;//在成批更新时记录锁定
var
AConnection ARecordSet : variant;
longintTemp : integer;
strTemp : string;
intIndex : integer;
begin
{创建一个临时的ODBC数据源指向一个MsAccess数据库并利用此DSN建立一个数据库连接}
AConnection := CreateOleObject(ADODBConnection);
AConnectionOpen(Driver={Microsoft Access Driver (*mdb)};DBQ=C:\inetpub\wwwroot\test);
{建立一个数据集对象并从数据表中提取数据}
ARecordSet := CreateOleObject(ADODBRecordSet);
ARecordSetopen( wfjcommuAConnectionadOpenStaticadLockOptimisticadCmdTable );
memolinesclear;
memolinesadd(********数据表原有的内容如下********);
{显示各个域的域名}
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]name+;;
memolinesadd( strTemp );
{显示各个域的内容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下条Next
end;
{增加一个记录}
ARecordSetAddNew;//增加Append
ARecordSetFields[AName] := ;//以FieldByName的方式存取
ARecordSetFields[Portable] := ;
ARecordSetFields() := ;//以Fields[index]的方式存取
ARecordSetFields() := ;
ARecordSetFields() := ;
ARecordSetUpdate;//更新Post
ARecordSetMoveFirst;//移到首条First
memolinesadd(********增加了一条记录后的数据表的内容如下********);
{显示各个域的内容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下条Next
end;
{修改最后一条记录}
ARecordSetMoveLast;
ARecordSetFields[AName] := ;//以FieldByName的方式存取
ARecordSetFields[Portable] := ;
ARecordSetFields() := ;//以Fields[index]的方式存取
ARecordSetFields() := ;
ARecordSetFields() := ;
ARecordSetUpdate;//更新Post
ARecordSetMoveFirst;//移到首条First
memolinesadd(********修改了最后一条记录后的数据表的内容如下********);
{显示各个域的内容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下条Next
end;
{删除最后一条记录}
ARecordSetMoveLast;//移到末条Last
ARecordSetdelete;//删除delete
ARecordSetUpdate;//更新在Delphi不需要
ARecordSetMoveFirst;//移到首条First
memolinesadd(********删除了最后一条记录后的数据表的内容如下********);
{显示各个域的内容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下条Next
end;
ARecordSetClose;{关闭数据集}
{用SQL语句进行查询查询姓名为张三的记录}
{注意在SQL语句中字符串应该用单引号包括起来}
ARecordSetopen( select * from wfjcommu where AName = 张三
AConnectionadOpenStaticadLockOptimisticadCmdText );
memolinesadd(********张三的内容如下********);
memolinesadd( 共有 + IntToStr( ARecordSetRecordCount ) + 条匹配的记录 );
{显示各个域的内容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下条Next
end;
{关闭数据集和数据库连接}
ARecordSetclose;
AConnectionclose;
end;
听别人说总不如自己看实际的例子来体会在这个例子中将演示如何利用ADO对象来对一个数据表进行查询增加记录修改记录和删除记录操作具体的用法请参见程序中的注释如果有点Delphi数据库编程经验相信不难理解
在我们的例子使用的数据库为TestMDB其中有一个数据表为wfjcommu有五个字段ANamePortableTelBPPostAddress分别表示姓名手机号电话号码呼机号码和通信地址