---- 經過編程和測試,在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:Inetpubwwwroot est.mdb AConnection.open('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:inetpubwwwroot 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,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: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;
新聞熱點
疑難解答
圖片精選