<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    曙海教育集團(tuán)論壇開(kāi)發(fā)語(yǔ)言培訓(xùn)專(zhuān)區(qū)Delphi程序設(shè)計(jì) → 在DELPHI程序中使用ADO對(duì)象存取ODBC數(shù)


      共有6194人關(guān)注過(guò)本帖樹(shù)形打印

    主題:在DELPHI程序中使用ADO對(duì)象存取ODBC數(shù)

    美女呀,離線,留言給我吧!
    wangxinxin
      1樓 個(gè)性首頁(yè) | 博客 | 信息 | 搜索 | 郵箱 | 主頁(yè) | UC


    加好友 發(fā)短信
    等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
    在DELPHI程序中使用ADO對(duì)象存取ODBC數(shù)  發(fā)帖心情 Post By:2010-12-14 10:25:14

    作為一個(gè)ASP愛(ài)好者,筆者經(jīng)常在ASP頁(yè)面中使用ADO對(duì)象操作ODBC數(shù)據(jù)庫(kù),覺(jué)得用ASP創(chuàng)建Web應(yīng)用系統(tǒng)確實(shí)是挺方便的。雖然在編程生涯中,筆者更喜歡Borland系列產(chǎn)品,對(duì)微軟產(chǎn)品有點(diǎn)排斥,但對(duì)ASP卻是例外。某天,忽然想到,ADO對(duì)象是一個(gè)標(biāo)準(zhǔn)OLE對(duì)象,如果在Delphi應(yīng)用程序中能利用ADO操作數(shù)據(jù)庫(kù),應(yīng)該挺不錯(cuò)。尤其在用DELPHI做網(wǎng)絡(luò)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),如果所在的Web站點(diǎn)是WINNT站點(diǎn)并且支持ASP頁(yè)面,那就可以用ADO對(duì)象訪問(wèn)ODBC數(shù)據(jù)庫(kù),而不用把那么大的BDE再上載到站點(diǎn)上去。這樣就可充分利用DELPHI和ASP的編程優(yōu)勢(shì),做出更好的ISAPI/NSAPI/CGI。經(jīng)過(guò)編程和測(cè)試,在Delphi中可以成功地用ADO對(duì)象存取ODBC數(shù)據(jù)庫(kù),現(xiàn)將本人的使用經(jīng)驗(yàn)寫(xiě)出來(lái),與大家共享,讓我們多一個(gè)訪問(wèn)ODBC數(shù)據(jù)庫(kù)的方法。

      在32位的Delphi中,可以聲明一個(gè)variant變量(如AVariant),然后通過(guò)CreateOleObject創(chuàng)建一個(gè)OLE對(duì)象,如AVariant:=CreateOleObject (’ADODB.Connection’)可以獲得一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象的實(shí)例,然后就可以利用該對(duì)象的方法和屬性來(lái)操作ODBC數(shù)據(jù)庫(kù)了。
    下面簡(jiǎn)單介紹一下訪問(wèn)ODBC數(shù)據(jù)庫(kù)所用到的ADO對(duì)象及其方法和屬性。


    1、數(shù)據(jù)庫(kù)連接對(duì)象(ADODB. Connection)
    該對(duì)象用于與ODBC數(shù)據(jù)庫(kù)建立連接,所有對(duì)數(shù)據(jù)庫(kù)的操作均通過(guò)該連接進(jìn)行。
    數(shù)據(jù)庫(kù)連接對(duì)象ADODB. Connection的作用象Delphi中的TDatabase對(duì)象。
    建立一個(gè)連接對(duì)象的方法為(AConnection為Variant類(lèi)型變量):
    AConnection:=CreateOleObject(’A DODB.Connection’)
    用于建立連接的方法為Open,使用語(yǔ)法為(以對(duì)象AConnection為例):
    AConnection.Open( ConnectionString, UserId, Password )
      三個(gè)參數(shù)均為字符串類(lèi)型,其中UserId和Password為用戶名稱和用戶密碼,用于訪問(wèn)數(shù)據(jù)庫(kù)使用時(shí)可以省略,因?yàn)樵贑onnectionString同樣可以指定用戶名稱和用戶密碼。ConnectionString是用來(lái)說(shuō)明ODBC數(shù)據(jù)源信息的字符串,其格式為:
    ’Provider=ProviderName; DSN=DSNName; DRIVER=driver; SERVER=server; DATABASE=database; UID=user; PWD=password’
    其中:
    Provider:數(shù)據(jù)提供者,默認(rèn)狀態(tài)下為MSDASQL,為微軟OLEDB,通常省略;
    DSN:要打開(kāi)的數(shù)據(jù)庫(kù)對(duì)應(yīng)的OBDC系統(tǒng)數(shù)據(jù)源(DSN),是可選參數(shù);
    DRIVER:要打開(kāi)的數(shù)據(jù)庫(kù)所用的驅(qū)動(dòng)程序名稱,如Access對(duì)應(yīng)Microsoft Access Driv (*.mdb),是可選參數(shù);
    SERVER:要打開(kāi)的數(shù)據(jù)庫(kù)所在的服務(wù)器名稱,本機(jī)可用(local),是可選參數(shù);
    DATABASE:要打開(kāi)的數(shù)據(jù)庫(kù)名稱,是可選參數(shù);
    UID:用戶名稱,用來(lái)訪問(wèn)數(shù)據(jù)庫(kù),是可選參數(shù);
    PWD:用戶密碼,用來(lái)訪問(wèn)數(shù)據(jù)庫(kù),是可選參數(shù)。
    以上參數(shù)均為可選參數(shù),但必須提供足夠的信息來(lái)描述一個(gè)系統(tǒng)數(shù)據(jù)源。
    假如已經(jīng)定義了一個(gè)ODBC的系統(tǒng)DSN,名稱為MyDsn,那么就可用以下語(yǔ)句建立一個(gè)數(shù)據(jù)庫(kù)連接:
    AConnection.Open(’DSN=MyDsn’);
      為了防止DSN不存在或其設(shè)置被他人修改時(shí)造成應(yīng)用程序運(yùn)行錯(cuò)誤,可以用ADODB.Connection 創(chuàng)建一個(gè)臨時(shí)ODBC數(shù)據(jù)源,這樣可以保證我們使用的系統(tǒng)DSN的參數(shù)設(shè)置是正確的。下面的語(yǔ)句可以創(chuàng)建一個(gè)臨時(shí)ODBC系統(tǒng)DSN,對(duì)應(yīng)一個(gè)ACCESS數(shù)據(jù)庫(kù),路徑為C:\Inetpub\ wwwroot\ test.mdb:
    AConnection.open(’Driver= {Microsoft Access Driver (*.mdb)};DBQ=C:\inetpub \wwwroot\test.mdb’)
      建立一個(gè)ADODB.Connection后,如果不需要返回操作結(jié)果(如刪除,修改,更新等操作)就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行正常的SQL操作了,此時(shí)應(yīng)用ADODB.Connection的另外一個(gè)方法Execute,使用語(yǔ)法為:
    AConnection.Execute( strSQL );
      其中strSQL為執(zhí)行操作的SQL語(yǔ)句,如刪除操作可以為:delete from wfjcommu。用AConnection.Close關(guān)閉一個(gè)數(shù)據(jù)庫(kù)連接。


    2、數(shù)據(jù)集對(duì)象(ADODB. RecordSet)
    如果要執(zhí)行查詢操作并返回查詢結(jié)果,或者要更方便地操作數(shù)據(jù)表,那就需要用到數(shù)據(jù)集對(duì)象了。
    數(shù)據(jù)集對(duì)象ADODB.RecordSet的作用象Delphi中的TTable或TQuery對(duì)象。
    建立一個(gè)數(shù)據(jù)集對(duì)象的方法為(ARecordSet為Variant類(lèi)型變量):
    ARecordSet:=CreateOleObject (’ADODB.RecordSet’)
    從數(shù)據(jù)表取得數(shù)據(jù)的方法為Open方法,具體使用方法為:
    ARecordSet.Open( strCommand,ActiveConnection,int CursorType,intLockType, intCommandType );
    其中:
    strCommand:字符串,為命令參數(shù),可以是一個(gè)Table名稱,可以是一個(gè)SQL語(yǔ)句,也可以是一個(gè)服務(wù)器上的存儲(chǔ)過(guò)程(StoredProc)名稱,具體需要后面的參數(shù)intCommandType來(lái)指定。
    ActiveConnection:要使用的數(shù)據(jù)庫(kù)連接,是一個(gè)ADODB. Connection對(duì)象。
    intCursorType:長(zhǎng)整數(shù),數(shù)據(jù)集的Cursor類(lèi)型,可選參數(shù),請(qǐng)參見(jiàn)程序中注釋。
    intLockType:長(zhǎng)整數(shù),對(duì)數(shù)據(jù)表的加鎖類(lèi)型,可選參數(shù),請(qǐng)參見(jiàn)程序中注釋。
    intCommandType:長(zhǎng)整數(shù),命令參數(shù)的類(lèi)型,用來(lái)指明strCommand的作用,可以指定strCommand為命令(如SQL語(yǔ)句)或數(shù)據(jù)表(TTable)或儲(chǔ)存過(guò)程(StoredProc),可選參數(shù),請(qǐng)參見(jiàn)程序中注釋。
    如執(zhí)行一個(gè)SQL查詢,可以采用如下語(yǔ)句:
    ARecordSet.Open(’Select * from wfjcommu’,adOpenStatic,ad LockOptimistic,adCmdText);
    其它常見(jiàn)屬性和方法與TTable和TQuery相比較如下(具體請(qǐng)見(jiàn)ASP幫助文件):
    eof,bof: eof,bof.MoveFirst, MoveLast: First, LastMovePrevious, MoveNext: Prior, NextMove: MoveByAddNew: appendUpdate: PostClose: close
    Delete加Update:delete,所有對(duì)數(shù)據(jù)表的修改均須用Update使操作有效,這與Delphi不同。
    Fields[FieldNo]: Fields[FieldNo]
    Fields[’FieldName’]: FieldByName(’FieldName’)


    3、其他常見(jiàn)對(duì)象(與Delphi對(duì)應(yīng)的對(duì)象):
    ADODB.Field: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError
    ADODB.Command:無(wú) ADODB.Property:無(wú)
    下面來(lái)看一個(gè)應(yīng)用例子:
    procedure TForm1.Button1Click(Sender: TObject);
    {*****************************************************
    用ADO操作ODBC數(shù)據(jù)庫(kù)
      本程序中,將創(chuàng)建一個(gè)臨時(shí)的ODBC系統(tǒng)數(shù)據(jù)源,指向一個(gè)MsAccess數(shù)據(jù)庫(kù),然后對(duì)其中的數(shù)據(jù)表進(jìn)行顯示、增加、修改、刪除和查詢操作
    注意:請(qǐng)?jiān)赨ses語(yǔ)句中包含ComObj單元
    *****************************************************}
    const{一些常量聲明,詳細(xì)請(qǐng)參見(jiàn)adovbs.inc}
    {---- CommandType的常量說(shuō)明 ----}
    adCmdUnknown = 0008;//未知,需要系統(tǒng)來(lái)判斷,速度慢,為缺省值
    adCmdText = 0001;//命令語(yǔ)句如SQL語(yǔ)句
    adCmdTable = 0002;//數(shù)據(jù)表名稱
    adCmdStoredProc = 0004;//存儲(chǔ)過(guò)程名稱

    {---- CursorType的常量說(shuō)明 ----}
    adOpenForwardOnly = 0;//只能由前向后單向訪問(wèn),為缺省值
    adOpenKeyset = 1;//可見(jiàn)其他用戶對(duì)數(shù)據(jù)的修改,但對(duì)其它用戶的增加和刪除不可見(jiàn)
    adOpenDynamic = 2;//其他用戶對(duì)數(shù)據(jù)的增加修改和刪除均可見(jiàn)
    adOpenStatic = 3;//其他用戶對(duì)數(shù)據(jù)的增加修改和刪除均不可見(jiàn)

    {---- LockType的常量說(shuō)明 ---}
    adLockReadOnly = 1;//只讀,為缺省值
    adLockPessimistic = 2;//在修改時(shí),按單個(gè)記錄鎖定
    adLockOptimistic = 3;//在修改后更新時(shí),按單個(gè)記錄鎖定
    adLockBatchOptimistic = 4;//在成批更新時(shí)記錄鎖定
    var
    AConnection, ARecordSet : variant;
    longintTemp : integer;
    strTemp : string;
    intIndex : integer;
    begin
    {創(chuàng)建一個(gè)臨時(shí)的ODBC數(shù)據(jù)源,指向一個(gè)MsAccess數(shù)據(jù)庫(kù),并利用此DSN建立一個(gè)數(shù)據(jù)庫(kù)連接}
    AConnection := CreateOleObject(’ADODB.Connection’);
    AConnection.Open(’Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\inetpub\wwwroot\test’);

    {建立一個(gè)數(shù)據(jù)集對(duì)象,并從數(shù)據(jù)表中提取數(shù)據(jù)}
    ARecordSet := CreateOleObject(’ADODB.RecordSet’);
    ARecordSet.open( ’wfjcommu’,AConnection,adOpenStatic,adLockOptimistic,adCmdTable );

    memo1.lines.clear;
    memo1.lines.add(’********數(shù)據(jù)表原有的內(nèi)容如下********’);
    {顯示各個(gè)域的域名}
    strTemp := ’’;
    for intIndex := 0 to ARecordSet.Fields.count - 1 do
    strTemp := strTemp + ARecordSet.Fields[intIndex].name+’;’;
    memo1.lines.add( strTemp );

    {顯示各個(gè)域的內(nèi)容}
    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;

    {增加一個(gè)記錄}
    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;//移到首條,F(xiàn)irst
    memo1.lines.add(’********增加了一條記錄后的數(shù)據(jù)表的內(nèi)容如下********’);
    {顯示各個(gè)域的內(nèi)容}
    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;//移到首條,F(xiàn)irst
    memo1.lines.add(’********修改了最后一條記錄后的數(shù)據(jù)表的內(nèi)容如下********’);
    {顯示各個(gè)域的內(nèi)容}
    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;//移到首條,F(xiàn)irst
    memo1.lines.add(’********刪除了最后一條記錄后的數(shù)據(jù)表的內(nèi)容如下********’);
    {顯示各個(gè)域的內(nèi)容}
    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;{關(guān)閉數(shù)據(jù)集}

    {用SQL語(yǔ)句進(jìn)行查詢,查詢姓名為“張三”的記錄}
    {注意,在SQL語(yǔ)句中,字符串應(yīng)該用單引號(hào)包括起來(lái)}
    ARecordSet.open( ’select * from wfjcommu where AName = ’’張三’’’,
    AConnection,adOpenStatic,adLockOptimistic,adCmdText );
    memo1.lines.add(’********張三的內(nèi)容如下********’);
    memo1.lines.add( ’共有’ + IntToStr( ARecordSet.RecordCount ) + ’條匹配的記錄’ );
    {顯示各個(gè)域的內(nèi)容}
    while not ARecordSet.eof do


    支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

    返回版面帖子列表

    在DELPHI程序中使用ADO對(duì)象存取ODBC數(shù)








    簽名
    主站蜘蛛池模板: 欧美啪啪动态图| 麻豆md国产在线观看| 无码AV中文一区二区三区| 人人妻人人添人人爽日韩欧美 | 一区二区中文字幕在线观看| 日本亚洲天堂网| 亚洲日韩中文无码久久| 男女xx00动态图120秒| 国产免费AV片在线观看播放| 777成影片免费观看| 天堂新版8中文在线8| 久久久久亚洲精品影视| 暖暖在线视频日本| 亚洲福利在线观看| 男人j进女人p一进一出视频| 国产三级在线观看免费| 鲤鱼乡太大了坐不下去| 国产边摸边吃奶叫床视频| 中国国产成人精品久久| 日本19禁啪啪无遮挡大尺度| 亚洲免费视频播放| 欧美精品国产综合久久| 北条麻妃大战黑人| 同性女电影三级中文字幕| 97视频免费在线| 天天操天天操天天射| 丰满岳乱妇在线观看中字无码| 日韩一卡2卡3卡4卡| 亚洲性无码av在线| 欧美精品久久天天躁| 全黄h全肉远古| 综合久久久久久久综合网| 国产成人亚洲精品大帝| 91九色在线播放| 国产麻豆媒一区一区二区三区| 一边摸一边爽一边叫床免费视频| 无码人妻少妇久久中文字幕| 九九视频高清视频免费观看| 果冻传媒国产仙踪林欢迎你| 亚洲精品tv久久久久久久久久| 激情内射日本一区二区三区|