说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在DELPHI中使用ADO对象存取ODBC数据库

HTML文档下载 WORD文档下载 PDF文档下载
在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数据库的方法.

在32位的DELPHI中,可以声明一个variant变量(如AVariant),然后通过CreateOleObject 创建一个OLE对象,如AVariant:=CreateOleObject('ADODB.Connection')可以获得一个数据库连接对象的实例,然后就可以利用该对象的方法和属性来操作ODBC数据库了.

下面简单介绍一下访问ODBC数据库所用到的ADO对象及其方法和属性.

1.数据库连接对象(ADODB.Connection)

该对象用于与ODBC数据库建立连接,所有对数据库的操作均通过该连接进行.

数据库连接对象ADODB.Connection的作用象Delphi中的TDatabase对象.

建立一个连接对象的方法为(AConnection为Variant类型变量):

AConnection:=CreateOleObject('ADODB.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\wwwroot\test.mdb

AConnection.open('Driver={MicrosoftAccess Driver (*.mdb)};DBQ=

C:\inetpub\wwwroot\test.mdb')

建立一个ADODB.Connection后,如果不需要返回操作结果(如删除,修改,更新等操作)就可以对数据库进行正常的SQL操作了,此时应用ADODB.Connection的另外一个方法Execute,使用语法为:

AConnection.Execute( strSQL );

其中strSQL为执行操作的SQL语句,如删除操作可以为:delete from wfjcommu 用AConnection.Close关闭一个数据库连接.

2.数据集对象(ADODB.RecordSet)

如果要执行查询操作并返回查询结果,或者要更方便地操作数据表,就需要用到数据集对象了.

数据集对象ADODB.RecordSet的作用象Delphi中的TTable或TQuery对象.

建立一个数据集对象的方法为(ARecordSet为Variant类型变量):

ARecordSet:=CreateOleObject('ADODB.RecordSet')

从数据表取得数据的方法为Open方法,具体使用方法为:

ARecordSet.Open( strCommand

ActiveConnection

intCursorType

intLockType

intCommandType );

其中: strCommand:字符串,为命令参数,可以是一个Table名称,可以是一个SQL语句,也可以是一个服务器上的存储过程(StoredProc)名称,具体需要后面的参数intCommandType来指定.

ActiveConnection:要使用的数据库连接,是一个ADODB.Connection对象.

intCursorType:长整数,数据集的Cursor类型,可选参数,请参见程序中注释。

intLockType:长整数,对数据表的加锁类型,可选参数,请参见程序中注释。

intCommandType:长整数,命令参数的类型,用来指明strCommand的作用,可以指定strCommand为命令(如SQL语句)或数据表(TTable)或储存过程(StoredProc),可选参数,请参见程序中注释。

如执行一个SQL查询,可以采用如下语句:

ARecordSet.Open('Select * from wfjcommu'

adOpenStatic

adLockOptimistic

adCmdText);

其它常见属性和方法与TTable和TQuery相比较如下(具体请见ASP帮助文件):

eof

bof:eof

bof.

MoveFirst

MoveLast:First

Last

MovePrevious

MoveNext:Prior

Next

Move:MoveBy

AddNew:append

Update:Post

Close:close

Delete加Update:delete,所有对数据表的修改均须用Update使操作有效,这与Delphi不同。

Fields[FieldNo]:Fields[FieldNo]

Fields['FieldName']:FieldByName('FieldName')

3.其它常见对象(与Delphi对应的对象):

ADODB.Field:TField ADODB.Parameter:

TPara ADODB.Error:EDBEngineError

ADODB.Command:无 ADODB.Property:无

下面来看一个应用例子,听别人说总不如自己看实际的例子来体会。在这个例子中,将演示如何利用ADO对象来对一个数据表进行查询、增加记录、修改记录和删除记录操作。具体的用法请参见程序中的注释,如果有点Delphi数据库编程经验,相信不难理解。

在我们的例子使用的数据库为Test.MDB,其中有一个数据表为wfjcommu,有五个字段AName、Portable、Tel、BP、PostAddress,分别表示姓名、手机号、电话号码、呼机号码和通信地址。

procedure TForm1.Button1Click(Sender: TObject);

{*****************************************************

用ADO操作ODBC数据库本程序中,将创建一个临时的ODBC系统数据源,指向一个MsAccess数据库,然后对其中的数据表进行显示、增加、修改、删除和查询操作注意:请在Uses语句中包含ComObj单元

*****************************************************}

const{ 一些常量声明,详细请参见adovbs.inc }

{ ---- CommandType的常量说明 ---- }

adCmdUnknown = 0008;//未知

需要系统来判断

速度慢

为缺省值

adCmdText = 0001;//命令语句如SQL语句

adCmdTable = 0002;//数据表名称

adCmdStoredProc = 0004;//存储过程名称

{ ---- CursorType的常量说明 ---- }

adOpenForwardOnly = 0;//只能由前向后单向访问

为缺省值

adOpenKeyset = 1;//可见其他用户对数据的修改

但对其它用户的增加和删除不可见

adOpenDynamic = 2;//其他用户对数据的增加修改和删除均可见

adOpenStatic = 3;//其他用户对数据的增加修改和删除均不可见

{---- LockType的常量说明 ---}

adLockReadOnly = 1;//只读

为缺省值

adLockPessimistic = 2;//在修改时

按单个记录锁定

adLockOptimistic = 3;//在修改后更新时

按单个记录锁定

adLockBatchOptimistic = 4;//在成批更新时记录锁定

var

AConnection

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\wwwroot\test');

{建立一个数据集对象

并从数据表中提取数据}

ARecordSet := CreateOleObject('ADODB.RecordSet');

ARecordSet.open( 'wfjcommu'

AConnection

adOpenStatic

adLockOptimistic

adCmdTable );

memo1.lines.clear;

memo1.lines.add('********数据表原有的内容如下********');

{显示各个域的域名}

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.Fields[intIndex].name+';';

memo1.lines.add( strTemp );

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.Fields

[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{增加一个记录}

ARecordSet.AddNew;//增加

Append

ARecordSet.Fields['AName'] := '1';

//以FieldByName的方式存取

ARecordSet.Fields['Portable'] := '2';

ARecordSet.Fields(2) := '3';

//以Fields[index]的方式存取

ARecordSet.Fields(3) := '4';

ARecordSet.Fields(4) := '5';

ARecordSet.Update;//更新,Post

ARecordSet.MoveFirst;//移到首条,First

memo1.lines.add('********增加了一条

记录后的数据表的内容如下********');

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.

Fields.count - 1 do

strTemp := strTemp +

ARecordSet.Fields[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{修改最后一条记录}

ARecordSet.MoveLast;

ARecordSet.Fields['AName'] := '11';

//以FieldByName的方式存取

ARecordSet.Fields['Portable'] := '22';

ARecordSet.Fields(2) := '33';

//以Fields[index]的方式存取

ARecordSet.Fields(3) := '44';

ARecordSet.Fields(4) := '55';

ARecordSet.Update;//更新,Post

ARecordSet.MoveFirst;//移到首条,First

memo1.lines.add('********修改了最后一条

记录后的数据表的内容如下********');

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to

ARecordSet.Fields.count - 1 do

strTemp := strTemp +

ARecordSet.Fields[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{删除最后一条记录}

ARecordSet.MoveLast;//移到末条,Last

ARecordSet.delete;//删除,delete

ARecordSet.Update;//更新,在Delphi不需要

ARecordSet.MoveFirst;//移到首条,First

memo1.lines.add('********删除了最后一条

记录后的数据表的内容如下********');

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.

Fields[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

ARecordSet.Close;{关闭数据集}

{用SQL语句进行查询

查询姓名为“张三”的记录}

{注意,在SQL语句中,字符串应该用单引号包括起来}

ARecordSet.open( 'select * from wfjcommu

where AName = ''张三'''

AConnection

adOpenStatic

adLockOptimistic

adCmdText );

memo1.lines.add('********张三的内容如下********');

memo1.lines.add( '共有' + IntToStr

( ARecordSet.RecordCount ) + '条匹配的记录' );

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.Fields

[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{关闭数据集和数据库连接}

ARecordSet.close;

AConnection.close;

end;

以上程序在PWIN98+DELPHI3.0+PWS(Personal Web Server)4.0下调试通过.

关于ADO对象的详细资料,请参见ASP帮助文件或Interdev帮助文件或OFFICE2000的有关文档。

VB如何在程序中启动 NT 的【拨号连接】对话框? VB如何在网页上使用 VB5 制作的 ActiveX 控件? VB如何中断【拨号网络连接】? 设计Browser及FTP程序 -VB资料 设计Chat程序 -VB资料 设计E-mail程序 -VB资料 使用VB获得一页的HTML代码 使用VB收发电子邮件 VB使用超链接和发送Email VB使用浏览器的文件复制对话框 输入/输出篇 -VB资料 通过WnetEnumResource函数获得网络资源 -VB资料 通往 Internet 的捷径-VB资料 显示计算机的名称 -VB资料 VB用 MAPI 控件实现发送邮件 VB用 WinSock 控件下载文件 VB用 Winsock 实现聊天的程序 VB用Internet Transfer编写FTP程序 VB用Sockets发送电子邮件 用VB 创建自己的通信程序 用VB5.0开发通信软件的技巧 用VB5开发IE 用VB编写网络寻呼 用VB编写小型的网络系统 用VB创建自己的通信程序 用VB构建Internet的应用 用VB开发标准CGI程序 用VB实现客户——服务器(TCP/IP)编程实例 用VB实现聊天讨论室和点对点会话 用VB写一个定时PING某IP的程序 用VB制作浏览器 scandir怎么用? 怎样从CMainFrame中调用DOCUMENT类中的PUBLIC成员!谢谢! 在线成中如何更新一个对话框 学习JAVA用JSDK开发还是VJ++?有什么区别吗?还是一样? "Resource id #1"是什么意思?? 主板上风扇都不转了,是什么原因??请教,谢谢!!! 乒乓球队进行比赛.... WIN98中公用文件夹窗体中文本框不能显示汉字 请问大虾:MDI窗体的菜单能不能和子窗体的菜单一起显示在菜单栏上??? 再谈关于PB控制Excel的问题。。。(ton2000) COM连接点客户端接受器的实现问题 为什么我的安装包不能安装?请高手指教,急啊。 送分问题:ASP字符串处理的函数有哪些? VB中将数据库中单条记录输出并打印! VB中如何宣告在DLL文件中的函数? 如何在正则表达式中加入变量 delphi 中的table 的filter有没有支持 like方法,该怎么用,同时filter当字段值为中文时怎么写? 主板上所有的风扇都不转了,硬盘和cpu都能正常工作,请教,谢谢!! 如何判别文件是不是文本文件? 新换了一块20G的硬盘,准备拿出10G安装Redhat7.2,请教最佳的分区方案? 关于武大华软 基于EJB的三层架构下的报表解决方案讨论...... 请问如何保存一个网站的资源 大学本科,,函授,自考,夜大,远程教育,自学!哪个硬! 比比! 斑竹到哪里去了???为什么我问的问题都没人解答的????斑竹职责何在??参与有分 基于EJB的三层架构下的报表解决方案讨论...... 哪位大侠可以给我解释一下“函数重载”是什么??请具体一些!! COM连接点客户端接受器的实现问题 用SQL SERVER中的imprort and export data 将paradox的数据库转为SQL SERVER数据库,可当数据库有密码时,如何转换? 请问java的xml解释器有哪些?怎么能在applet里用这些解释器? 一个小问题!有分哦 关于DBgrid的操作? 一个关于header的问题 一个小问题!有分哦 基于EJB的三层架构下的报表解决方案讨论...... 我这个LoadCursor为何不听话 jsp连接数据库(Access)的问题 局域网中为什么网上邻居里只能找到自己,别人找不到我的计算机,我也看不见别人的? LoadImageA()函数的参数的说明 怎样将一个服务注册成NT的系统服务 本人准备休整 **********获得文件大小的问题********* 关于武大华软 請教:vb里dim oRs as ADODB.Recordset 與dim oRs as new ADODB.Recordset的區別在哪里? delphi6又现bug,敬请网友注意!!!!!!!!!!!!!!! 找错误! 请playyuer(女㊣爱)及其它高手提供一些经典实用的ADO语法或SQL语句或(MSDN上有的就不要提供了) 关于武大华软 请帮我逐行解释下C++Builder的基本代码结构。谢谢 哪位有本事能帮我破开一个邮箱密码? 消息捕获 无色无味的化学有毒物质是什么?能够溶于水但是不有颜色和味道. 什么是酸式酸根离子 魔酸是啥 化学反应热的判断 马铃薯是()荸荠是()藕是() 比魔酸厉害的有吗 化学反应是几级反应如何判断 藕荸荠马铃薯和洋葱各属于什么器官 荧光棒里的液体是有毒的马? 化学反应的热效应焓变有没有方向?与反应热相等时意义相同么 酸式酸根离子到底是什么,怎么记 碱+多数非金属氧化物=盐+水的方程式 在化学反应中,怎么判断是不是有这个反应 由原子构成的分子 质量仍然很小 如何表示比较方便? 非金属氧化物+碱→盐+水的反应条件是什么?条件是什么? 酸根一定是酸式的吗 分子是由原子构成的 这句话对吗RT,注意,不是物质,是分子,这里我主要是想问一下分子可不可以由离子构成,譬如说有没氯化钠分子这样的说的. 像铁,有二价有三价的、到底什么时候才是二价的什么时候是三价的?还有铜啊什么的都有不同化合价的是什么时候用什么价的呀? 我们常吃的蔬菜水果等:1番茄2葡萄3洋葱4大白菜5韭菜6花椰菜7藕8马铃薯9黄花菜10萝卜 所食的部分属于根的是属于茎属于叶的是属于花的事属于果实的是 分子一定是由原子构成的嘛?某粒子由10个质子,10个中子和10个电子构成,则该粒子是A分子 B原子 C离子 D不能确定我选的是B,不是分子一定是由原子构成的吗?怎么可以是由质子,中子和电子构成? 某金属元素R只有一种化合价,已知其氧化物的相对分子质量为M,氯化物的相对分子质量为N,则该金属元素的化合价为( )A +(2N-M)/55 B +( N-M) /27.5C + (2m-n) /55 D +(M-N) /27.5经分析某不纯的黄铁 酸根和酸式酸根的区别(具体) 能能证明分子是由原子构成的是A.铁矿石研磨成粉末B.水加热到沸腾变成气体C.公园中闻到花香D.加热氧化汞有水银生成 世界上酸性最弱的酸 问几道高中生物必修二遗传方面的题目题目比较多,实在是学的有点乱 答案只给了正确内容 没有解析, 实在是很难想 希望能够讲解 . 我有自己思考的,想了两天了.题目可能有点多,耽误各位时 什么样的物质是酸 碱+非金属氧化物=盐+水 反应条件:非金属氧化物是酸性氧化物 反应类型:RT 酸式根和酸式酸根范围?酸根大于酸式根? 冰酸是什么物质 大家好我姐的宝宝误吃了荧光棒里面的液体4个小时了人现在没异常有毒吗有毒怎么办医生也说不出什么办法谢谢 酸式弱酸根的概念谁能说一下哈? 能与酸反应的物质有? 生小孩是物理反应还是化学反应?如题 1.已知25~C,101kPa条件下:4Al(s)+3O2(g)=2Al2O3(s) -2834.9kJ/mol4Al(s)+2O3(g)=2Al2O3(s) -3119.1kJ/mol由此得出的正确结论是A.等质量的O2比O3能量低,由O2变O3为放热反应B.等质量的O2比O3能量高,由O2变O3为吸热反应C.O 荧光棒液体流到手上对皮肤有害吗 生孩子是化学反应还是物理反应 S(g)+O2(g)=SO2(g) 1 S(s)+O2(g)=SO2(g) 2这2个哪个反应热大?怎么比较? 如何分辨物质是由原子还是由分子组成希望能详细点 碱+酸性氧化物生成盐+水到底属于什么反应? 如何检验自制葡萄酒中是否有对人体有害的物质 从温度带上看,安徽省合肥市位于( ) A.热带B亚热带.C.暖温带D.中温带 酸性氧化物+碱—盐+水,举些例子 哪些物质是由分子直接构成,哪些是原子直接构成的怎么区分 荧光棒里边的液体有毒么 各写五个 碱+酸性氧化物→盐+水 的化学方程式 怎样判断酸所对应的酸根.如为什么碳酸所对应的酸根为碳酸氢根? 怎么样辨别物质是由分子还是原子组成的 下列有关秦岭-淮河一线地理意义的叙述,错误的是(  ) A.湿润区与半湿润区的分界线 B.暖温带与亚热带下列有关秦岭-淮河一线地理意义的叙述,错误的是(  )A.湿润区与半湿润区 但是,碳酸氢根不是多元弱酸的酸式酸根,不能拆开写的吗. 怎样才能分辨物质是由分子还是原子构成的简略概括就好,且要清楚,有特例的也讲下.Thank you! 为什么元素的化合价有的只有一个,有的有好几个呢?化合价是根据什么而定的呢? 什么东西无色无味又有毒最近不知道哪里来了只野猫,老是来偷我们家的东西吃,尤其是吃剩的菜和肉,很恼火,我们又是租房子住的,条件限制没法把东西藏完,那猫也关不住,总是能进家,所以我 化学反应热效应数值是什么?化学反应热效应数值与参加反应物质的多少有关为什么是错的距离中反应热效应数值由a变为2a不就是因为反应物增多了吗? 魔酸为什么有那么强的酸性据说其酸性为浓硫酸的10亿倍,为什么, 化学中所讲的物品无色无味是什么意思?味道有人尝过?黄样中的毒是无色无味他为什么还觉得水的味道不对? 酸式酸根离子的定义我知道碳酸氢根离子,硫酸氢根离子等都是,问下定义 什么酸的酸性最强? 什么东西有毒但是无色无味 请问高中都有什么酸式酸根离子呢?能意义列举出来吗 请问魔酸是最强的酸吗?将80%的五氟化锑溶在氢氟酸中的混合酸魔酸是不是最强的酸?顺便问一下,已知的碱性最强的碱是什么?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘