亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

在DELPHI程序中使用ADO對象存取ODBC數據庫

2019-11-18 18:49:16
字體:
來源:轉載
供稿:網友
作為一個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 est.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:inetpubwwwroot est');

{建立一個數據集對象,并從數據表中提取數據}
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下調試通過。

上一篇:Delphi4的Winsocket編程

下一篇:Delphi中獲取打印機設備名和端口名

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91国产中文字幕| 国语自产精品视频在线看| 98精品在线视频| 成人久久久久爱| 欧美午夜精品久久久久久久| 亚洲第一级黄色片| 国产在线精品成人一区二区三区| 成人av番号网| 尤物九九久久国产精品的特点| 欧美激情久久久久| 欧美精品电影免费在线观看| 亚洲aaa激情| 夜夜嗨av一区二区三区免费区| 啪一啪鲁一鲁2019在线视频| 欧美成人免费视频| 国产美女扒开尿口久久久| 欧美理论电影在线观看| 成人久久18免费网站图片| 欧洲美女免费图片一区| 欧美在线一级视频| 韩国三级日本三级少妇99| 日本sm极度另类视频| 欧美在线视频一区二区| 国产中文欧美精品| 中文字幕精品视频| 欧美日韩国产一中文字不卡| 91在线观看免费高清| 亚洲自拍偷拍在线| 国产成人福利夜色影视| 国产日韩欧美日韩| 欧美在线观看网址综合| 热久久这里只有精品| 国产日产亚洲精品| 亚洲精品自拍偷拍| 日韩电影免费在线观看中文字幕| 国产精品精品久久久久久| 欧美最猛性xxxxx免费| 91av在线国产| 国产欧美精品一区二区三区-老狼| 日韩在线视频免费观看| 亚洲精品影视在线观看| 成人黄色中文字幕| 在线观看国产欧美| 亚洲精品资源美女情侣酒店| 成人在线小视频| 成人国产亚洲精品a区天堂华泰| 久久香蕉频线观| 91欧美激情另类亚洲| 日日噜噜噜夜夜爽亚洲精品| 欧美日韩国产丝袜另类| 97在线视频一区| 91精品国产色综合久久不卡98口| 国产精品国产福利国产秒拍| 国产精品视频网| 欧美激情xxxx性bbbb| 青草热久免费精品视频| 精品国产欧美一区二区五十路| 欧美激情在线有限公司| 亚洲高清久久久久久| 欧美成人性生活| 国产一区二区黄| 国产有码一区二区| 永久免费看mv网站入口亚洲| 午夜精品一区二区三区视频免费看| 欧美性猛交xxxx久久久| 国产一区二区欧美日韩| 欧美成人精品h版在线观看| 欧美疯狂做受xxxx高潮| 欧美成人午夜激情视频| 欧美诱惑福利视频| 国产成人鲁鲁免费视频a| 欧美一级大片在线免费观看| 欧美精品一区三区| 国产成人高潮免费观看精品| 欧美在线观看一区二区三区| 视频在线一区二区| 日产精品久久久一区二区福利| 国产国产精品人在线视| 国产免费久久av| 日韩美女免费观看| 欧美电影免费在线观看| 欧美精品少妇videofree| 亚洲最大福利视频网站| 精品久久久精品| 日本国产一区二区三区| 欧美裸身视频免费观看| 国产精品久久久久久久久免费看| 日韩在线播放视频| 色偷偷噜噜噜亚洲男人的天堂| 日韩午夜在线视频| 国产精品亚洲精品| 欧美孕妇孕交黑巨大网站| 欧美激情一区二区三区成人| 92国产精品视频| 欧美一级大片视频| 日韩在线视频播放| 亚洲人成在线观看| 亚洲成人动漫在线播放| 亚洲japanese制服美女| 91av在线网站| 久久久亚洲天堂| 亚洲国产第一页| 日韩免费av一区二区| 色多多国产成人永久免费网站| 国产精品久久久久久久7电影| 亚洲欧美一区二区三区四区| 国产色综合天天综合网| 国产精品白嫩初高中害羞小美女| 久久网福利资源网站| 亚洲男人天堂网| 精品自拍视频在线观看| 国产精品久久久久久久av大片| 欧美激情按摩在线| 欧美裸身视频免费观看| 久久视频这里只有精品| 日韩av理论片| 操日韩av在线电影| 亚洲已满18点击进入在线看片| www国产亚洲精品久久网站| 日本一欧美一欧美一亚洲视频| 亚洲精品在线不卡| 国产一区二区在线免费| 亚洲精品小视频在线观看| 亚洲欧美日本另类| 91欧美日韩一区| 欧美性20hd另类| 琪琪亚洲精品午夜在线| 日韩免费精品视频| 国产精品69久久久久| 亚洲成人网在线观看| 中文字幕日韩av综合精品| 黑人与娇小精品av专区| 亚洲国产精品福利| 欧美国产日韩在线| 成人免费看吃奶视频网站| 久久久亚洲影院你懂的| 日韩成人久久久| 欧美日韩中文在线| 在线观看国产精品91| 免费不卡在线观看av| 国产精品美女视频网站| 国产精品色午夜在线观看| 国产精品成人品| 久久久伊人欧美| 精品福利免费观看| 国产精品免费久久久久影院| 亚洲大胆美女视频| 久久伊人免费视频| 亚洲欧美精品中文字幕在线| 日本亚洲欧美三级| 日韩精品视频免费| 国产偷国产偷亚洲清高网站| 国产日本欧美视频| 久久伊人色综合| 在线视频亚洲欧美| 91av视频在线观看| 国产日韩欧美影视| 乱亲女秽乱长久久久| 精品久久久久久久大神国产| 91在线高清免费观看| 日本精品视频在线观看| 一区二区三区动漫| 最好看的2019年中文视频| 欧美在线欧美在线|