在DELPHI程序中使用ADO对象存取ODBC数据库
作为一个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 ( ADODB Connection )可以获得一个数据库连接对象的实例 然后就可以利用该对象的方法和属性来操作ODBC数据库了 下面简单介绍一下访问ODBC数据库所用到的ADO对象及其方法和属性
数据库连接对象(ADODB Connection) 该对象用于与ODBC数据库建立连接 所有对数据库的操作均通过该连接进行 数据库连接对象ADODB Connection的作用象Delphi中的TDatabase对象 建立一个连接对象的方法为(AConnection为Variant类型变量) AConnection:=CreateOleObject( A DODB Connection ) 用于建立连接的方法为Open 使用语法为(以对象AConnection为例) AConnection Open( 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 那么就可用以下语句建立一个数据库连接 AConnection Open( DSN=MyDsn ); 为了防止DSN不存在或其设置被他人修改时造成应用程序运行错误 可以用ADODB Connection 创建一个临时ODBC数据源 这样可以保证我们使用的系统DSN的参数设置是正确的 下面的语句可以创建一个临时ODBC系统DSN 对应一个ACCESS数据库 路径为C:\Inetpub\ root\ test mdb AConnection open( Driver= {Microsoft Access Driver (* mdb)};DBQ=C:\inetpub \root\test mdb ) 建立一个ADODB Connection后 如果不需要返回操作结果(如删除 修改 更新等操作)就可以对数据库进行正常的SQL操作了 此时应用ADODB Connection的另外一个方法Execute 使用语法为 AConnection Execute( strSQL ); 其中strSQL为执行操作的SQL语句 如删除操作可以为 delete from wfjmu 用AConnection Close关闭一个数据库连接 数据集对象(ADODB RecordSet) 如果要执行查询操作并返回查询结果 或者要更方便地操作数据表 那就需要用到数据集对象了 数据集对象ADODB RecordSet的作用象Delphi中的TTable或TQuery对象 建立一个数据集对象的方法为(ARecordSet为Variant类型变量) ARecordSet:=CreateOleObject ( ADODB RecordSet ) 从数据表取得数据的方法为Open方法 具体使用方法为 ARecordSet Open( strCommand ActiveConnection int CursorType intLockType intCommandType ); 其中 strCommand 字符串 为命令参数 可以是一个Table名称 可以是一个SQL语句 也可以是一个服务器上的存储过程(StoredProc)名称 具体需要后面的参数intCommandType来指定 ActiveConnection 要使用的数据库连接 是一个ADODB Connection对象 intCursorType 长整数 数据集的Cursor类型 可选参数 请参见程序中注释 intLockType 长整数 对数据表的加锁类型 可选参数 请参见程序中注释 intCommandType 长整数 命令参数的类型 用来指明strCommand的作用 可以指定strCommand为命令(如SQL语句)或数据表(TTable)或储存过程(StoredProc) 可选参数 请参见程序中注释 如执行一个SQL查询 可以采用如下语句 ARecordSet Open( Select * from wfjmu adOpenStatic ad LockOptimistic adCmdText); 其它常见属性和方法与TTable和TQuery相比较如下(具体请见ASP帮助文件) eof bof: eof bof.MoveFirst MoveLast: First LastMovePrevious MoveNext: Prior NextMove: MoveByAddNew: appendUpdate: PostClose: close Delete加Update delete 所有对数据表的修改均须用Update使操作有效 这与Delphi不同 Fields[FieldNo]: Fields[FieldNo]Fields[ FieldName ]: FieldByName( FieldName ) 其他常见对象(与Delphi对应的对象) ADODB Field: TField ADODB Parameter: TPara ADODB Error: EDBEngineErrorADODB Command 无 ADODB Property 无 下面来看一个应用例子 procedure TForm Button Click(Sender: TObject);{*****************************************************用ADO操作ODBC数据库 本程序中 将创建一个临时的ODBC系统数据源 指向一个MsAccess数据库 然后对其中的数据表进行显示 增加 修改 删除和查询操作注意 请在Uses语句中包含ComObj单元*****************************************************}const{一些常量声明 详细请参见adovbs inc}{ CommandType的常量说明 }adCmdUnknown = ;//未知 需要系统来判断 速度慢 为缺省值adCmdText = ;//命令语句如SQL语句adCmdTable = ;//数据表名称adCmdStoredProc = ;//存储过程名称
{ CursorType的常量说明 }adOpenForwardOnly = ;//只能由前向后单向访问 为缺省值adOpenKeyset = ;//可见其他用户对数据的修改 但对其它用户的增加和删除不可见adOpenDynamic = ;//其他用户对数据的增加修改和删除均可见adOpenStatic = ;//其他用户对数据的增加修改和删除均不可见
{ LockType的常量说明 }adLockReadOnly = ;//只读 为缺省值adLockPessimistic = ;//在修改时 按单个记录锁定adLockOptimistic = ;//在修改后更新时 按单个记录锁定adLockBatchOptimistic = ;//在成批更新时记录锁定varAConnection ARecordSet : variant;longintTemp : integer;strTemp : string;intIndex : integer;begin{创建一个临时的ODBC数据源 指向一个MsAccess数据库 并利用此DSN建立一个数据库连接}AConnection := CreateOleObject( ADODB Connection );AConnection Open( Driver={Microsoft Access Driver (* mdb)};DBQ=C:\inetpub\root\test );
{建立一个数据集对象 并从数据表中提取数据}ARecordSet := CreateOleObject( ADODB RecordSet );ARecordSet open( wfjmu AConnection adOpenStatic adLockOptimistic adCmdTable );
memo lines clear;memo lines add( ********数据表原有的内容如下******** );{显示各个域的域名}strTemp := ;for intIndex := to ARecordSet Fields count dostrTemp := strTemp + ARecordSet Fields[intIndex] name+ ; ;memo lines add( strTemp );
{显示各个域的内容}while not ARecordSet eof dobeginstrTemp := ;for intIndex := to ARecordSet Fields count dostrTemp := strTemp + ARecordSet Fields[intIndex] value+ ; ;memo lines add( strTemp );ARecordSet MoveNext;//移到下条 Nextend;
{增加一个记录}ARecordSet AddNew;//增加 AppendARecordSet Fields[ AName ] := ;//以FieldByName的方式存取ARecordSet Fields[ Portable ] := ;ARecordSet Fields( ) := ;//以Fields[index]的方式存取ARecordSet Fields( ) := ;ARecordSet Fields( ) := ;ARecordSet Update;//更新 PostARecordSet MoveFirst;//移到首条 Firstmemo lines add( ********增加了一条记录后的数据表的内容如下******** );{显示各个域的内容}while not ARecordSet eof dobeginstrTemp := ;for intIndex := to ARecordSet Fields count dostrTemp := strTemp + ARecordSet Fields[intIndex] value+ ; ;memo lines add( strTemp );ARecordSet MoveNext;//移到下条 Nextend;
{修改最后一条记录}ARecordSet MoveLast;ARecordSet Fields[ AName ] := ;//以FieldByName的方式存取ARecordSet Fields[ Portable ] := ;ARecordSet Fields( ) := ;//以Fields[index]的方式存取ARecordSet Fields( ) := ;ARecordSet Fields( ) := ;ARecordSet Update;//更新 PostARecordSet MoveFirst;//移到首条 Firstmemo lines add( ********修改了最后一条记录后的数据表的内容如下******** );{显示各个域的内容}while not ARecordSet eof dobeginstrTemp := ;for intIndex := to ARecordSet Fields count dostrTemp := strTemp + ARecordSet Fields[intIndex] value+ ; ;memo lines add( strTemp );ARecordSet MoveNext;//移到下条 Nextend;
{删除最后一条记录}ARecordSet MoveLast;//移到末条 LastARecordSet delete;//删除 deleteARecordSet Update;//更新 在Delphi不需要ARecordSet MoveFirst;//移到首条 Firstmemo lines add( ********删除了最后一条记录后的数据表的内容如下******** );{显示各个域的内容}while not ARecordSet eof dobeginstrTemp := ;for intIndex := to ARecordSet Fields count dostrTemp := strTemp + ARecordSet Fields[intIndex] value+ ; ;memo lines add( strTemp );ARecordSet MoveNext;//移到下条 Nextend;
ARecordSet Close;{关闭数据集}
{用SQL语句进行查询 查询姓名为 张三 的记录}{注意 在SQL语句中 字符串应该用单引号包括起来}ARecordSet open( select * from wfjmu where AName = 张三 AConnection adOpenStatic adLockOptimistic adCmdText );memo lines add( ********张三的内容如下******** );memo lines add( 共有 + IntToStr( ARecordSet RecordCount ) + 条匹配的记录 );{显示各个域的内容}while not ARecordSet eof dobeginstrTemp := ;for intIndex := to ARecordSet Fields count dostrTemp := strTemp + ARecordSet Fields[intIndex] value+ ; ;memo lines add( strTemp );ARecordSet MoveNext;//移到下条 Nextend;
lishixinzhi/Article/program/Delphi/201311/25077