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

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

HTML文档下载 WORD文档下载 PDF文档下载
在DELPHI程序中使用ADO对象存取ODBC数据库

关键词:Delphi - MIS

作为一个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('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\ wwwroot\ test.mdb:

AConnection.open('Driver= {Microsoft Access 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

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 wfjcommu'

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')

3、其他常见对象(与Delphi对应的对象):

ADODB.Field: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError

ADODB.Command:无 ADODB.Property:无

下面来看一个应用例子:

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;

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

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

以上程序在PWIN98+ Delphi 3.0+PWS(Personal Web Server)4.0下调试通过。

初学编程者必知的五个网站 大数据基准测试专题论坛:基准测试是一把尚未完成的尺子 大数据应用(下):应用驱动技术,DaaS创造价值 大数据研究与发展专题论坛:大数据在各领域中的应用及发展策略 雅虎新目标:欲收购照片分享网站Imgur 移动开发工具访谈《近匠》第01期:七牛云存储—BaaS进化论 ShareSDK:A轮融资到位!将推社会化评论SDK 70美元,你也能用Raspberry Pi做个专属iBeacon基站 7个鲜为人知却超实用的PHP函数 从管理远程式团队和分布式团队中所获得的宝贵经验 Netflix开源数据流管理器Suro Google新创意:天花板加麦克风 人脑植芯片 苹果获弯曲屏新专利 可给手机弄个大波浪卷 真正的跨平台硬件测试:3DMark已打通PC、iOS、Android 将Chrome浏览器变成终端工具 【开源推荐】AllJoyn:打造全球物联网的通用开源框架 21张图带你走进Google数据中心 Snapchat C轮融资5000万美元 投资方是Coatue Management 又一个被谷歌寄生的平台,Chrome应用启动器现来到OS X上 雷军遇上刘德华:创业、艺术、移动互联网 为了抗衡Android,传微软开始考虑WP和WinRT免费 维护代码库的五个精华实践 微软发布安全补丁 IE11.0.2随之而来 Qt 5.2正式版发布 全面支持移动平台 如何节约手游制作成本?揭秘CocoStudio编辑器强悍功能 市场竞争白热化:三大云服务商上演双十二“三国杀” UCloud联手盛科实现SDN硬件应用 AWS,还有多远? Instagram推新私信功能Direct:支持照片、视频和文本信息 微软CEO鲍尔默最后一次受访:我的正确决定远远大于过错 中国创新碰撞硅谷思潮, 2013云世界大会定义云时代 急~~~高分求救~! 谢谢duduwolf,请来领分 类似这样的字符串“Thu Sep 5 14:05:56 2002”,怎么转化为Date对象? 安装问题,很简单,小弟菜鸟,望各位兄长多多关照啦!谢了! MDI窗口出错 新手请教。如何在cgi程序中得到由url传递过来的值 ISA 2K发布多个WEB 服务器问题,(我都要疯了) 我的xp怎么不能装vc6.0?再线等待!(20分) 急~~~高分求救~! 请教各位师兄。这个可以实现吗? 向高手请教(如何把客户端的图片传到服务器?) 各位大虾.水晶报表的关键一步了.实现了我就可以水晶报表的打印了! 急急!!!!怎样才能取得java函数传过来的参数呢? %%%%非高手勿進%%% CSDN有些人素质太差! IShellFolder::GetDisplayNameOf 如何获得全名? 代理Type分别为transparent,anonymous,high anonymity,优劣? 为感谢computersim在大力相助,特奉送100分,快来拿啊 请教网上书店系统的设计思想和例子。 VC中使用FLASH的OCX控件如何取得Movie的原始大小,且如何按指定比例缩放?问题解决后必给分。 有关“隐藏”,“覆盖”的一些问题: 如何把A库中A表原样复制到B库中去? 怎样取得鼠标点击DataGrid控件时是哪一行,哪一列呢?(C#) ISA 2K发布多个WEB 服务器问题,(我都要疯了)高分求救 这个问题怎么办?? (ADO OPEN) Up 有分! 母亲生日,你觉得送什么礼物为好? 用c++ 写的 hello 程序在unix g++ 编译通过后,运行出错 如下几个初级问题要问,高手们请进-> SQLSERVER高手进来聊聊........ 怎样用代码实现两台电脑之间的文件传输? 哪位知道Microsoft Firewall Client 的下载地址? 关于RECORDset的问题,求教 如何在web页面使用 Windows 窗体控件,最好有例子! 使用DOM的XMLHttpRequest对象来发送xml请求,但当返回的响应带有中文时候,在PDA上无法正常显示,我使用MultiByteToWideChar也没用。有人 请问在窗口中放置控件时,PB是否有靠近格线对齐的功能。如果有,在哪设置? DELPHI中FASTNET组件使用方法 请问在SELECT查询中怎样娶得行号? 在一般的类中如何得到当前文档的指针? 巨菜问题:重装xp后grub启动菜单消失,怎么办? FIP上传问题,非常着急,在线等,解决就结贴, 用javaScript打开窗口后,原窗口的gif动画不动了 FindWindow的用法 反正没几个人能回答,发来玩玩。 在当前文档中如何实现刷新操作? 构造sql语句时,表名或字段有可能是sql的保留字段,如何解决? 小弟急需文件操作和线程管理方面方法技巧的资料,望各位英雄赐教 怎么将power point打包成exe 如何恢复execl中vba的密码 怎样在ISA中设置带宽限制? 如何实现数据库的更新?? 搜胡首页是<<美英百架战机空袭伊拉克 攻伊序幕已拉开>>,但... 应该是 急求700水包水多彩体系的配方 1.罗马法与秦律有哪些相同之处?试写出三点. 门槛粤语有没读门狠噶类似读音的的的的 线粒体中为什么含ATP合成酶、核酸合成酶、丙酮酸氧化酶,为什么不含乳酸氧化酶? 下列有关酸、碱、盐氧化物的说法,正确的是A 所有碱都易溶于水B 碱和盐反映一定有沉淀生成C 盐和氧化物一定含金属元素D 碱和氧化物一定含氧元素 血浆出来血管就是组织液?也就是说渗出毛细血管就是组织液?那成分不一模一样?他们可以直接转化? 龟牌水晶极限蜡T-321I和龟牌白金蜡T-411I什么好 地理高一必修1地表形态 爆炸形式有几种? 镀膜蜡和普通蜡有什么不一样汽车的 高一地理必修一第四章第一节营造地表形态的力量主要讲什么内容 小猪用英文怎么说 哪个软件划分2D网格比较好?我想画质量好的2D网格再导入moldflow里, 英语翻译如题. 小猪 英文怎么说我记得词典上看过,有专用词汇,不是pig.那是泛称,请有水准的人来指点下.不要揣着糊涂装明白,借此来骗分. 扬州三把刀是什么... 平衡吊翻译成英语 急用!请帮帮忙吧! 关于罗志祥的英语文章不要百度的那篇Alan Luo...的,在全班面前演讲用,不要太长了,一两分钟就好.急~ moldflow手动创建流道为什么划分不了网格?划分了仍然是一条直线~咋办? 成长的足迹500字作文 翻译"你哥哥现在在哪儿度假呢?(on a vacation) Autodesk Moldflow Synergy 2012 划分网格功能只能在安装完后用一天,我尝试过再次安装,第一天能用也能划分网格,第二天就不能用了,无论什么见,怎么改参数都不能用,要怎么办?总不能用一次重新安 成长的足迹 作文 要500字以上啊 英汉互译:how far on vacation stay at home 刀的构造有什么物理知识 有两种气态烷烃的混合物,其平均摩尔质量为30g/mol,则下列说法正确的是:A、一定有甲烷B、一定有乙烷C、可能是甲烷和乙烷的混合物D、可能是丙烷和乙烷的混合物请说明原因, 石磨面粉机、新型石磨面粉机、石磨面粉机组哪里的最好? 青藏地区耕地分布在河谷地区最主要原因? 初三化学酸、碱、盐部分的实验题实验题最头疼了,各位给我收集一些题来练习吧,多多益善啊, Fe+KSCN===? 剁肉的刀的物理知识DFG 镍锰电池,助焊剂的英文翻译 元素符号口诀类似于“碳C,铜Cu,N氮、P磷、S硫.” 怎样使刀更锋利用物理知识回答 英语翻译Elemental analyses of the samples are summa-rized in Table 1.The most striking feature of the results is that the content of aluminum ions decreased progressively while that of silicon ions increased as crystallization proceeded.The incre 石磨面粉有什么特点?如何辨别 成长的足迹500字谢谢啦 英语翻译1Always WALT on the pavement!2ATthe traffic lights3Can you see the green man Yes.4At a zebra quickly5Is there any traffic?No 某密闭容器内有X、Y、Z、W四种物质,在一定条件下充分反应,测得反应前后各物质的质量如下表:物质XYZW反应前质量/g41102 反应后质量/g待测548下列说法正确的是A.反应后X的质量为8g B.Z与W的 作文成长的足迹500字,要写小时候的事情.450~500字 英语翻译谁帮我把“把某人锁在外面”翻译成英语单词? 为什么吃石磨面粉 红日梗概100字 化学元素Ds,急化学元素Ds,原子序数是110,最外层电子数是多少,各层是如何分布的? 有理数的性质为顺序性,稠密性,四则运算封闭性. 音乐上的小人为什么能在音乐翩翩起舞? 秦律和罗马法律的异同点 原子序数是50的原子结构示意图怎么画 红日简介主要内容 一般要多长时间才能形成生物钟,哪些行为会破坏生物钟? 有理数的概念 为什么充满了气的气球,过几天会瘪? 求两篇英文作文.1、金钱于幸福 80词左右.2、动物为什么是人的朋友 80词左右.百度复制的就免了,我也会找. 有理数定义 红日主要内容 成长的足迹作文400字 “非正有理数”是什么意思? 《红日》的主要内容?《红日》的主要内容,还得是比较短的.适合写在作文本(小的)上的. 突然,一种骄傲油然而生,我们真是一群很BIU的少女啊.BIU是啥意思? 券字噶 噶粤语读法点读?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘