作為一個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數據庫的方法
在位的Delphi中可以聲明一個variant變量(如AVariant)然後通過CreateOleObject創建一個OLE對象如AVariant:=CreateOleObject (ADODBConnection)可以獲得一個數據庫連接對象的實例然後就可以利用該對象的方法和屬性來操作ODBC數據庫了
下面簡單介紹一下訪問ODBC數據庫所用到的ADO對象及其方法和屬性
數據庫連接對象(ADODB Connection)
該對象用於與ODBC數據庫建立連接所有對數據庫的操作均通過該連接進行
數據庫連接對象ADODB Connection的作用象Delphi中的TDatabase對象
建立一個連接對象的方法為(AConnection為Variant類型變量)
AConnection:=CreateOleObject(A DODBConnection)
用於建立連接的方法為Open使用語法為(以對象AConnection為例)
AConnectionOpen( 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那麼就可用以下語句建立一個數據庫連接
AConnectionOpen(DSN=MyDsn);
為了防止DSN不存在或其設置被他人修改時造成應用程序運行錯誤可以用ADODBConnection 創建一個臨時ODBC數據源這樣可以保證我們使用的系統DSN的參數設置是正確的下面的語句可以創建一個臨時ODBC系統DSN對應一個ACCESS數據庫路徑為C:\Inetpub\ wwwroot\ testmdbAConnectionopen(Driver= {Microsoft Access Driver (*mdb)};DBQ=C:\inetpub \wwwroot\testmdb)
建立一個ADODBConnection後如果不需要返回操作結果(如刪除修改更新等操作)就可以對數據庫進行正常的SQL操作了此時應用ADODBConnection的另外一個方法Execute使用語法為
AConnectionExecute( strSQL );
其中strSQL為執行操作的SQL語句如刪除操作可以為delete from wfjcommu用AConnectionClose關閉一個數據庫連接
數據集對象(ADODB RecordSet)
如果要執行查詢操作並返回查詢結果或者要更方便地操作數據表那就需要用到數據集對象了
數據集對象ADODBRecordSet的作用象Delphi中的TTable或TQuery對象
建立一個數據集對象的方法為(ARecordSet為Variant類型變量)
ARecordSet:=CreateOleObject (ADODBRecordSet)
從數據表取得數據的方法為Open方法具體使用方法為
ARecordSetOpen( strCommandActiveConnectionint CursorTypeintLockType intCommandType );
其中
strCommand字符串為命令參數可以是一個Table名稱可以是一個SQL語句也可以是一個服務器上的存儲過程(StoredProc)名稱具體需要後面的參數intCommandType來指定
ActiveConnection要使用的數據庫連接是一個ADODB Connection對象
intCursorType長整數數據集的Cursor類型可選參數請參見程序中注釋
intLockType長整數對數據表的加鎖類型可選參數請參見程序中注釋
intCommandType長整數命令參數的類型用來指明strCommand的作用可以指定strCommand為命令(如SQL語句)或數據表(TTable)或儲存過程(StoredProc)可選參數請參見程序中注釋
如執行一個SQL查詢可以采用如下語句
ARecordSetOpen(Select * from wfjcommuadOpenStaticad LockOptimisticadCmdText);
其它常見屬性和方法與TTable和TQuery相比較如下(具體請見ASP幫助文件)
eofbof: eofbof.MoveFirst MoveLast: First LastMovePrevious MoveNext: Prior NextMove: MoveByAddNew: appendUpdate: PostClose: close
Delete加Updatedelete所有對數據表的修改均須用Update使操作有效這與Delphi不同
Fields[FieldNo]: Fields[FieldNo]
Fields[FieldName]: FieldByName(FieldName)
其他常見對象(與Delphi對應的對象)
ADODBField: TField ADODBParameter: TPara ADODBError: EDBEngineError
ADODBCommand無 ADODBProperty無
下面來看一個應用例子
procedure TFormButtonClick(Sender: TObject);
{*****************************************************
用ADO操作ODBC數據庫
本程序中將創建一個臨時的ODBC系統數據源指向一個MsAccess數據庫然後對其中的數據表進行顯示增加修改刪除和查詢操作
注意請在Uses語句中包含ComObj單元
*****************************************************}
const{一些常量聲明詳細請參見adovbsinc}
{ CommandType的常量說明 }
adCmdUnknown = ;//未知需要系統來判斷速度慢為缺省值
adCmdText = ;//命令語句如SQL語句
adCmdTable = ;//數據表名稱
adCmdStoredProc = ;//存儲過程名稱
{ CursorType的常量說明 }
adOpenForwardOnly = ;//只能由前向後單向訪問為缺省值
adOpenKeyset = ;//可見其他用戶對數據的修改但對其它用戶的增加和刪除不可見
adOpenDynamic = ;//其他用戶對數據的增加修改和刪除均可見
adOpenStatic = ;//其他用戶對數據的增加修改和刪除均不可見
{ LockType的常量說明 }
adLockReadOnly = ;//只讀為缺省值
adLockPessimistic = ;//在修改時按單個記錄鎖定
adLockOptimistic = ;//在修改後更新時按單個記錄鎖定
adLockBatchOptimistic = ;//在成批更新時記錄鎖定
var
AConnection ARecordSet : variant;
longintTemp : integer;
strTemp : string;
intIndex : integer;
begin
{創建一個臨時的ODBC數據源指向一個MsAccess數據庫並利用此DSN建立一個數據庫連接}
AConnection := CreateOleObject(ADODBConnection);
AConnectionOpen(Driver={Microsoft Access Driver (*mdb)};DBQ=C:\inetpub\wwwroot\test);
{建立一個數據集對象並從數據表中提取數據}
ARecordSet := CreateOleObject(ADODBRecordSet);
ARecordSetopen( wfjcommuAConnectionadOpenStaticadLockOptimisticadCmdTable );
memolinesclear;
memolinesadd(********數據表原有的內容如下********);
{顯示各個域的域名}
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]name+;;
memolinesadd( strTemp );
{顯示各個域的內容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下條Next
end;
{增加一個記錄}
ARecordSetAddNew;//增加Append
ARecordSetFields[AName] := ;//以FieldByName的方式存取
ARecordSetFields[Portable] := ;
ARecordSetFields() := ;//以Fields[index]的方式存取
ARecordSetFields() := ;
ARecordSetFields() := ;
ARecordSetUpdate;//更新Post
ARecordSetMoveFirst;//移到首條First
memolinesadd(********增加了一條記錄後的數據表的內容如下********);
{顯示各個域的內容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下條Next
end;
{修改最後一條記錄}
ARecordSetMoveLast;
ARecordSetFields[AName] := ;//以FieldByName的方式存取
ARecordSetFields[Portable] := ;
ARecordSetFields() := ;//以Fields[index]的方式存取
ARecordSetFields() := ;
ARecordSetFields() := ;
ARecordSetUpdate;//更新Post
ARecordSetMoveFirst;//移到首條First
memolinesadd(********修改了最後一條記錄後的數據表的內容如下********);
{顯示各個域的內容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下條Next
end;
{刪除最後一條記錄}
ARecordSetMoveLast;//移到末條Last
ARecordSetdelete;//刪除delete
ARecordSetUpdate;//更新在Delphi不需要
ARecordSetMoveFirst;//移到首條First
memolinesadd(********刪除了最後一條記錄後的數據表的內容如下********);
{顯示各個域的內容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下條Next
end;
ARecordSetClose;{關閉數據集}
{用SQL語句進行查詢查詢姓名為張三的記錄}
{注意在SQL語句中字符串應該用單引號包括起來}
ARecordSetopen( select * from wfjcommu where AName = 張三
AConnectionadOpenStaticadLockOptimisticadCmdText );
memolinesadd(********張三的內容如下********);
memolinesadd( 共有 + IntToStr( ARecordSetRecordCount ) + 條匹配的記錄 );
{顯示各個域的內容}
while not ARecordSeteof do
begin
strTemp := ;
for intIndex := to ARecordSetFieldscount do
strTemp := strTemp + ARecordSetFields[intIndex]value+;;
memolinesadd( strTemp );
ARecordSetMoveNext;//移到下條Next
end;
{關閉數據集和數據庫連接}
ARecordSetclose;
AConnectionclose;
end;
聽別人說總不如自己看實際的例子來體會在這個例子中將演示如何利用ADO對象來對一個數據表進行查詢增加記錄修改記錄和刪除記錄操作具體的用法請參見程序中的注釋如果有點Delphi數據庫編程經驗相信不難理解
在我們的例子使用的數據庫為TestMDB其中有一個數據表為wfjcommu有五個字段ANamePortableTelBPPostAddress分別表示姓名手機號電話號碼呼機號碼和通信地址
From:http://tw.wingwit.com/Article/program/Delphi/201311/25077.html