久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区

以文本方式查看主題

-  曙海教育集團(tuán)論壇  (http://m.rfoamep.cn/bbs/index.asp)
--  Delphi程序設(shè)計(jì)  (http://m.rfoamep.cn/bbs/list.asp?boardid=76)
----  在DELPHI程序中使用ADO對(duì)象存取ODBC數(shù)  (http://m.rfoamep.cn/bbs/dispbbs.asp?boardid=76&id=2559)

--  作者:wangxinxin
--  發(fā)布時(shí)間:2010-12-14 10:25:14
--  在DELPHI程序中使用ADO對(duì)象存取ODBC數(shù)

作為一個(gè)ASP愛好者,筆者經(jīng)常在ASP頁(yè)面中使用ADO對(duì)象操作ODBC數(shù)據(jù)庫(kù),覺得用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ì)象訪問ODBC數(shù)據(jù)庫(kù),而不用把那么大的BDE再上載到站點(diǎn)上去。這樣就可充分利用DELPHI和ASP的編程優(yōu)勢(shì),做出更好的ISAPI/NSAPI/CGI。經(jīng)過編程和測(cè)試,在Delphi中可以成功地用ADO對(duì)象存取ODBC數(shù)據(jù)庫(kù),現(xiàn)將本人的使用經(jīng)驗(yàn)寫出來,與大家共享,讓我們多一個(gè)訪問ODBC數(shù)據(jù)庫(kù)的方法。

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


1、數(shù)據(jù)庫(kù)連接對(duì)象(ADODB. Connection)
該對(duì)象用于與ODBC數(shù)據(jù)庫(kù)建立連接,所有對(duì)數(shù)據(jù)庫(kù)的操作均通過該連接進(jìn)行。
數(shù)據(jù)庫(kù)連接對(duì)象ADODB. Connection的作用象Delphi中的TDatabase對(duì)象。
建立一個(gè)連接對(duì)象的方法為(AConnection為Variant類型變量):
AConnection:=CreateOleObject(’A DODB.Connection’)
用于建立連接的方法為Open,使用語(yǔ)法為(以對(duì)象AConnection為例):
AConnection.Open( ConnectionString, UserId, Password )
  三個(gè)參數(shù)均為字符串類型,其中UserId和Password為用戶名稱和用戶密碼,用于訪問數(shù)據(jù)庫(kù)使用時(shí)可以省略,因?yàn)樵贑onnectionString同樣可以指定用戶名稱和用戶密碼。ConnectionString是用來說明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:要打開的數(shù)據(jù)庫(kù)對(duì)應(yīng)的OBDC系統(tǒng)數(shù)據(jù)源(DSN),是可選參數(shù);
DRIVER:要打開的數(shù)據(jù)庫(kù)所用的驅(qū)動(dòng)程序名稱,如Access對(duì)應(yīng)Microsoft Access Driv (*.mdb),是可選參數(shù);
SERVER:要打開的數(shù)據(jù)庫(kù)所在的服務(wù)器名稱,本機(jī)可用(local),是可選參數(shù);
DATABASE:要打開的數(shù)據(jù)庫(kù)名稱,是可選參數(shù);
UID:用戶名稱,用來訪問數(shù)據(jù)庫(kù),是可選參數(shù);
PWD:用戶密碼,用來訪問數(shù)據(jù)庫(kù),是可選參數(shù)。
以上參數(shù)均為可選參數(shù),但必須提供足夠的信息來描述一個(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類型變量):
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ǔ)過程(StoredProc)名稱,具體需要后面的參數(shù)intCommandType來指定。
ActiveConnection:要使用的數(shù)據(jù)庫(kù)連接,是一個(gè)ADODB. Connection對(duì)象。
intCursorType:長(zhǎng)整數(shù),數(shù)據(jù)集的Cursor類型,可選參數(shù),請(qǐng)參見程序中注釋。
intLockType:長(zhǎng)整數(shù),對(duì)數(shù)據(jù)表的加鎖類型,可選參數(shù),請(qǐng)參見程序中注釋。
intCommandType:長(zhǎng)整數(shù),命令參數(shù)的類型,用來指明strCommand的作用,可以指定strCommand為命令(如SQL語(yǔ)句)或數(shù)據(jù)表(TTable)或儲(chǔ)存過程(StoredProc),可選參數(shù),請(qǐng)參見程序中注釋。
如執(zhí)行一個(gè)SQL查詢,可以采用如下語(yǔ)句:
ARecordSet.Open(’Select * from wfjcommu’,adOpenStatic,ad LockOptimistic,adCmdText);
其它常見屬性和方法與TTable和TQuery相比較如下(具體請(qǐng)見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、其他常見對(duì)象(與Delphi對(duì)應(yīng)的對(duì)象):
ADODB.Field: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError
ADODB.Command:無(wú) ADODB.Property:無(wú)
下面來看一個(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)參見adovbs.inc}
{---- CommandType的常量說明 ----}
adCmdUnknown = 0008;//未知,需要系統(tǒng)來判斷,速度慢,為缺省值
adCmdText = 0001;//命令語(yǔ)句如SQL語(yǔ)句
adCmdTable = 0002;//數(shù)據(jù)表名稱
adCmdStoredProc = 0004;//存儲(chǔ)過程名稱

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

{---- LockType的常量說明 ---}
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)包括起來}
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


久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
国产精品久久久久久久久久久久午夜片 | 日韩三级免费观看| 色狠狠av一区二区三区| 91极品美女在线| 欧美综合一区二区三区| 欧美三级日韩三级国产三级| 欧美日韩黄色影视| 欧美v亚洲v综合ⅴ国产v| 久久精品夜色噜噜亚洲a∨| 中文字幕一区二区三区视频| 亚洲一区二区在线免费观看视频 | 欧美在线观看视频在线| 欧美精品第1页| 久久精品无码一区二区三区| 自拍偷在线精品自拍偷无码专区 | 成人免费视频国产在线观看| 1卡2卡3卡精品视频| 免费试看一区| 91久久精品一区二区三| 日韩一区二区影院| 中文字幕在线一区免费| 五月婷婷久久丁香| 国产91精品精华液一区二区三区| 91捆绑美女网站| 欧美中文娱乐网| 欧美另类高清zo欧美| 日本一区免费视频| 亚洲国产精品久久久男人的天堂 | 亚洲最色的网站| 精东粉嫩av免费一区二区三区| 99精品视频一区| 日本一区二区免费看| 欧美日韩一区成人| 国产精品视频九色porn| 日韩成人一区二区| 91丨porny丨最新| 在线不卡视频一区二区| 久久欧美一区二区| 日韩av不卡在线观看| 91在线云播放| 色欧美片视频在线观看在线视频| 久久久久久久久一| 日本中文一区二区三区| 成人在线免费观看一区| 在线精品亚洲一区二区不卡| 国产欧美一区二区精品性色超碰 | 欧美日韩中字一区| 国产精品久久久久国产精品日日| 日韩1区2区日韩1区2区| 成人免费91在线看| 欧美女孩性生活视频| 日韩理论在线观看| 成人av免费网站| 欧美性猛片aaaaaaa做受| 亚洲日本韩国一区| caoporn国产精品| 欧日韩精品视频| 亚洲久草在线视频| 91在线国内视频| 欧美日韩情趣电影| 亚洲大片在线观看| 国产精品久久久久久久久婷婷| 欧美自拍丝袜亚洲| 亚洲精品国产视频| 国产精品播放| 久久综合久色欧美综合狠狠| 九九国产精品视频| 色悠久久久久综合欧美99| 亚洲人成网站色在线观看| 99国产欧美另类久久久精品| 欧美日韩一级片在线观看| 午夜欧美在线一二页| 久久久久天天天天| 国产精品国产三级国产aⅴ原创| 高清久久久久久| 欧美日韩视频一区二区| 奇米精品一区二区三区在线观看| 欧美日韩精品免费观看| 国产精品人人做人人爽人人添| 北岛玲一区二区三区四区| 欧美日韩三级视频| 久久精品国产精品亚洲红杏| 一区二区日本伦理| 亚洲成人中文在线| 日韩av高清| 亚洲人成在线播放网站岛国| 韩国一区二区三区美女美女秀| 久久免费午夜影院| 国产激情视频一区二区在线观看| 欧美视频一二三区| 久久精品国产网站| 欧美日韩一级片网站| 激情综合色播五月| 欧美日韩成人激情| 黄网站免费久久| 欧美日韩一区二区在线观看视频| 免费人成精品欧美精品| 欧美在线观看一二区| 激情五月播播久久久精品| 欧美喷潮久久久xxxxx| 国产激情91久久精品导航| 欧美高清视频一二三区| 国产精品69毛片高清亚洲| 日韩视频免费观看高清完整版在线观看 | 久久久精品中文字幕麻豆发布| 成人精品鲁一区一区二区| 日韩一二三区不卡| 国产精品18久久久久久vr| 日韩欧美一区二区三区在线| 99久久免费视频.com| 中文字幕av资源一区| 欧美日韩中文国产一区发布| 亚洲综合区在线| 在线观看欧美黄色| 成人性视频网站| 国产精品三级电影| 日本不卡免费新一二三区| 日韩精品欧美精品| 欧美久久久久中文字幕| 成人爱爱电影网址| 国产精品久久毛片a| 亚洲国产午夜伦理片大全在线观看网站 | 日韩一级二级三级| 91麻豆国产福利在线观看| ㊣最新国产の精品bt伙计久久| 日本精品免费| 精品影视av免费| 久久久久成人黄色影片| 欧美一区三区二区在线观看| 石原莉奈在线亚洲二区| 日韩一区二区电影在线| 成人羞羞视频免费| 偷窥少妇高潮呻吟av久久免费| 在线不卡a资源高清| 91精品网站| 午夜成人免费电影| 精品少妇一区二区三区| 国外成人在线视频网站| 美女诱惑一区二区| 久久伊人蜜桃av一区二区| 日本一区二区三区视频免费看| 激情欧美一区二区三区在线观看| 久久久国产一区二区三区四区小说| 欧美午夜精品久久久久免费视| 国内外精品视频| 亚洲婷婷在线视频| 亚洲国产日韩a在线播放性色| 欧美日韩一级二级| 国产一区二区三区在线看麻豆| 色哟哟一区二区在线观看| 高清不卡一二三区| 中文字幕一区二区三区精华液| 自拍亚洲欧美老师丝袜| 91在线精品秘密一区二区| 亚洲成人免费视频| 日韩欧美久久久| 四虎一区二区| 91首页免费视频| 奇米色一区二区| 国产精品欧美精品| 欧美丰满一区二区免费视频| 久久久精品国产一区二区三区| 国产91精品欧美| 午夜视频一区在线观看| 国产日韩欧美亚洲| 欧美日韩一区国产| 欧美色欧美亚洲另类七区| 不卡一二三区首页| av免费精品一区二区三区| 国产麻豆一区二区三区在线观看| 超碰97网站| 日韩亚洲视频| 狠狠色狠狠色合久久伊人| 日本一区二区免费在线| 欧美日韩另类国产亚洲欧美一级| 激情五月综合色婷婷一区二区| 国产一区二区在线电影| 亚洲五月六月丁香激情| 中文字幕乱码日本亚洲一区二区| 欧美日韩国产在线观看| 四虎一区二区| 国产精品久久久久久久久久久久冷 | 国产精品一级黄| 五月激情六月综合| 亚洲欧洲av另类| 久久综合久久鬼色| av亚洲精华国产精华精| 欧美大片在线观看一区| 伊人久久大香线蕉成人综合网 | 99国产高清| 国产精品一区二区久激情瑜伽| 亚洲18色成人| 亚洲影院理伦片| 亚洲人成在线观看一区二区| 久久看人人爽人人| 日韩欧美的一区| 91麻豆精品91久久久久同性| 欧美性videosxxxxx| 色综合视频在线观看| 亚洲高清在线观看一区|