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

    Rss & SiteMap

    曙海教育集團論壇 http://www.bjzhda.cn

    曙海教育集團論壇
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
    [瀏覽完整版]

    標題:在DELPHI程序中使用ADO對象存取ODBC數

    1樓
    wangxinxin 發表于:2010-12-14 10:25:14

    作為一個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 Driv (*.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\test.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:\inetpub\wwwroot\test’);

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

    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

    Copyright © 2000 - 2009 曙海教育集團
    Powered By 曙海教育集團 Version 2.2
    Processed in .01758 s, 2 queries.
    主站蜘蛛池模板: 18禁无遮挡羞羞污污污污免费| 国产啪精品视频网站| 久久精品亚洲日本波多野结衣| 欧美激情视频一区二区| 国产一区二区三区日韩精品| 2019国产麻豆剧传媒视| 天天做天天爱夜夜爽毛片毛片 | 国内精品一区二区三区在线观看| 久久久久av综合网成人| 暴力调教一区二区三区| 亚洲视频国产精品| 精品久久久BBBB人妻| 国产小视频在线观看网站| 97人洗澡从澡人人爽人人模| 女人把私人部位扒开视频在线看 | 国产人成免费视频| 91久久另类重口变态| 大学生秘书胯下吞吐| 中文字幕最新在线| 日本一道一区二区免费看| 亚洲国产成人久久综合一区77| 波多野结衣免费在线| 卡通动漫中文字幕第一区| 苍井空亚洲精品AA片在线播放| 国产精品一在线观看| GOGOGO高清免费看韩国| 好男人www视频| 久久久久亚洲精品男人的天堂| 日韩片在线观看| 亚洲成色在线综合网站| 欧美黄色片免费观看| 全黄性性激高免费视频| 精品国际久久久久999波多野| 国产女人aaa级久久久级| 521色香蕉网站在线观看| 国产高清精品入口91| 一个人看的www免费高清中文字幕| 成人av鲁丝片一区二区免费| 久久国产劲暴∨内射| 日韩av无码一区二区三区| 亚洲区小说区激情区图片区 |