• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

        VC數(shù)據(jù)庫編程區(qū)分

        VC數(shù)據(jù)庫編程區(qū)分

        更新時(shí)間:2019-06-21 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        作者: 胡朝暉

            我們知道,在VB下進(jìn)行基于ADO的編程相對(duì)比較簡單,只要我們通過reference加載了適當(dāng)?shù)念愋蛶煲院,我們就可以正常的調(diào)用ADO對(duì)象,但是可能很多開發(fā)人員對(duì)于VC下的基于ADO,OLE DB的數(shù)據(jù)庫開發(fā)就沒有很多經(jīng)驗(yàn)了。所以我們有必要先討論一下VC下基于ADO開發(fā)的幾種模式。

          VC下關(guān)于ADO的操作分析

          一般來說,用VC++有三種方法可以實(shí)現(xiàn)對(duì)ADO的操作:

          1. 通過#import方法

          2. 通過利用MFC OLE的ClassWizard

          3. 通過Windows API中COM相關(guān)的函數(shù)

        在所有這三種方法種,#import是最方便的方法,它允許你產(chǎn)生一個(gè)類似VB的類結(jié)構(gòu)。使你的開發(fā)變的很方便。

          #import方法

          在#import中,你需要提供所包含的類型庫的路徑和名稱,它能夠自動(dòng)產(chǎn)生一個(gè)對(duì)GUIDs的定義,同時(shí)對(duì)自動(dòng)生成對(duì)ADO對(duì)象的封裝。同時(shí),能夠列舉它在類型庫中所能找到的類型,對(duì)任何你所引用的類型庫,VC++會(huì)在編譯的時(shí)候自動(dòng)生成兩個(gè)文件:

          一個(gè)頭文件(.tlh),它包含了列舉的類型和對(duì)類型庫中對(duì)象的定義

          一個(gè)實(shí)現(xiàn)文件(.tli)對(duì)類型庫對(duì)象模型中的方法產(chǎn)生封裝。

        比如,你在stdafx.h文件中增加對(duì)msado15.dd的import以后,VC++會(huì)產(chǎn)生msado15.tlh和msado15.tli兩個(gè)文件。

          #import也能夠使用一個(gè)新的類,_com_ptr_t,也被稱為智能指針。智能指針能夠自動(dòng)執(zhí)行QuyerInterface,AddRef和Release函數(shù)。對(duì)一個(gè)COM對(duì)象模型使用#import產(chǎn)生代碼和VBA很類似。

          下面的代碼演示了如何使用#import在你的應(yīng)用中實(shí)現(xiàn)對(duì)ADO的操作:

          #import "c:\program files\common files\system\ado\msado15.dll" \

          no_namespace

          rename ( "EOF", "adoEOF" )

        對(duì)EOF進(jìn)行該名是必要的,因?yàn)榈湫偷腣C++應(yīng)用都已經(jīng)定義了EOF作為常數(shù)-1。

          下面分析用#import定義和初始化ADO對(duì)象

          通常來說,操作一個(gè)自動(dòng)化對(duì)象需要兩個(gè)步驟:定義和初始化一個(gè)用來操作COM對(duì)象的變量。通過#import你可以在一行代碼完成這個(gè)工作,通過使用智能指針(_com_ptr_t)的構(gòu)造函數(shù)傳遞一個(gè)有效的CLSID或者是PROGID。開發(fā)人員也可以通過_com_ptr_t::CreateInstance()方法來定義對(duì)象的一個(gè)示例。具體代碼如下所示:

          _ConnectionPtr Conn1( __uuidof( Connection ) );

        也可以采用下面的代碼實(shí)現(xiàn)同樣的功能

          _ConnectionPtr Conn1 = NULL; file://定義對(duì)象

          HRESULT hr = S_OK;

          hr = Conn1.CreateInstance( __uuidof( Connection ) ); file://創(chuàng)建實(shí)例

        推薦采用第二種方法,因?yàn)槿绻玫谝环N方法的話不能返回一個(gè)失敗的HRESULT,所以也就不能判斷ADO連接對(duì)象是成功還是失敗。注意這里的__uuidof( Connection)中的Connection是在.tlh文件中定義的。通過把它傳遞給方法CreateInstance,實(shí)際上就是創(chuàng)建了一個(gè)有效的ADOConnection對(duì)象。

          需要注意到的是#import中有一個(gè)屬性為no_namespace,這是告訴編譯器該類不在一個(gè)單獨(dú)的名字空間中,使用no_namespace意味著你不需要在初始化變量的時(shí)候引用名字空間。當(dāng)然如果在你的應(yīng)用中需要倒入多個(gè)類型庫的話,最后不要使用no_namespace,以免引起名字沖突。

          下面是簡單的基于ADO應(yīng)用的代碼,采用了#import方法:

          #include

          #import rename("EOF", "adoEOF")

          void main()

           {

            HRESULT hr = S_OK;

            file://因?yàn)闆]有在#import中指定no_namespace,所以必須采用ADODB::這樣的形式

            file://來作為變量類型

            ADODB::_RecordsetPtr Rs1 = NULL;

            file://通過ODBC建立ADO連接

            _bstr_t Connect( "DSN=AdoDemo;UID=sa;PWD=;" );

            _bstr_t Source ( "SELECT * FROM Authors" );

            CoInitialize();

            file://初始化Rs1對(duì)象

            hr = Rs1.CreateInstance( __uuidof( ADODB::Recordset ) );

            file://對(duì)hr的返回正確性判斷省略

            Rs1->Open( Source, Connect,

            ADODB::adOpenForwardOnly,

            ADODB::adLockReadOnly, -1 );

            file://這里可以對(duì)記錄集Rs1進(jìn)行操作

            Rs1->Close();

            Rs1 = NULL;

            ::MessageBox( NULL, "Success!", "", MB_OK );

            CoUninitialize();

           }

            用MFC OLE創(chuàng)建ADO應(yīng)用

          MFC OLE類似于#import,能夠?qū)σ粋(gè)類型庫產(chǎn)生一個(gè)封裝(wrapper),但是不象#import,MFC OLE不能夠從類型庫中產(chǎn)生枚舉類型,但是它能夠更干凈的實(shí)現(xiàn)ADO。MFC類CString和COleVariant隱藏了BSTRS和Variants的細(xì)節(jié)。需要注意的是,有MFC OLE產(chǎn)生的類封裝都是繼承了類ColeDispatchDriver,由ADO產(chǎn)生的失敗的HRESULTS被封裝在類ColeDispatchException中。

          首先我們需要說明一下用MFC OLE ClassWizard創(chuàng)建ADO應(yīng)用的幾個(gè)不可缺少的步驟:

          從Tools菜單中,選擇Options,然后選擇Directories tab,在Show Directories中,選擇Library Files,然后在directories增加路徑C:\program files\common files\system\ado,這樣做的目的是設(shè)置包含ADO類型庫的路徑。

          從View菜單中,選擇ClassWizard,點(diǎn)擊Add Class按紐并選擇From A Type Library...,然后在Type Library dialog box對(duì)話框中,從C:\program files\common files\system\ado選擇文件msado15.dll,在Confirm Classes對(duì)話框中,選擇所有列出的類并按OK按紐,退出ClassWizard。實(shí)際上,ClassWizard為你生成了兩個(gè)文件msado15.h和msado15.cpp.

          下面的代碼是實(shí)現(xiàn)ADO應(yīng)用的自己編寫的代碼:

          AfxOleInit(); file://初始化COM對(duì)象

          ...

          _Recordset Rs1; file://定義數(shù)據(jù)集對(duì)象

          COleException e;
          COleVariant Connect( "DSN=AdoDemo;UID=sa;PWD=;" );

          COleVariant Source ( "SELECT * FROM Authors" );

          file://創(chuàng)建數(shù)據(jù)集對(duì)象

          Rs1.CreateDispatch( "ADODB.Recordset.2.0", &e );

          Rs1.Open( (VARIANT) Source, (VARIANT) Connect, 0, 1, -1 );

          file://這里可以對(duì)結(jié)果集Rs1進(jìn)行處理

          Rs1.Close();

          Rs1.ReleaseDispatch();

          AfxMessageBox("Success!");

          #import和MFC OLE都圍繞著一個(gè)給定的自動(dòng)化對(duì)象產(chǎn)生了一個(gè)封裝類,它們分別繼承自_com_ptr_t和ColeDispatchDriver。但是事實(shí)上,你可以通過使用Windows API函數(shù)直接初始化ADO對(duì)象,下面討論直接用Win32 API函數(shù)來操作COM對(duì)象。
            用COM API創(chuàng)建ADO工程

          為了直接使用ADO和COM對(duì)象,需要添加兩個(gè)頭文件adoid.h和adoint.h,這兩個(gè)頭文件定義了CLSIDs,接口定義和你操作ADO類型庫所需要的枚舉類型。同時(shí)你也需要增加頭文件INITGUID.H。

          為了能夠編譯用COM API創(chuàng)建的ADO工程文件,你需要安裝OLE DB SDK或者是MSDASDK工具。下面是簡單的示例代碼:

          #include

          #include

          #include "adoid.h" // ADO的GUID's

          #include "adoint.h" // ADO的類、枚舉等等

          void main()

          {

           HRESULT hr = S_OK;

           ADORecordset* Rs1 = NULL; // ADORecordset 是在adoint.h中定義的

           VARIANT Source;

           VARIANT Connect;

           VariantInit( &Source );

           VariantInit( &Connect );

           Source.vt = VT_BSTR;

           Source.bstrVal = ::SysAllocString( L"SELECT * FROM Authors");

           Connect.vt = VT_BSTR;

           Connect.bstrVal = ::SysAllocString( L"DSN=AdoDemo;UID=sa;PWD=;" );

           hr = CoCreateInstance( CLSID_CADORecordset,

           NULL,

           CLSCTX_INPROC_SERVER,

           IID_IADORecordset,

           (LPVOID *) &Rs1 );

           if( SUCCEEDED( hr ) ) hr = Rs1->Open( Source,

           Connect,

           adOpenForwardOnly,

           adLockReadOnly,

           -1 );

           file://這里你可以對(duì)記錄集Rs1進(jìn)行處理

           if( SUCCEEDED( hr ) ) hr = Rs1->Close();

           if( SUCCEEDED( hr ) ) { Rs1->Release(); Rs1 = NULL; }

           if( SUCCEEDED( hr ) ) ::MessageBox( NULL, "Success!", "", MB_OK );

          } 

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 亚洲精品人成电影网| 国产一区二区免费在线| 国产亚洲真人做受在线观看| 一级一级一片免费高清| 人人狠狠综合久久亚洲高清| 亚洲AV无码国产精品永久一区| 野花高清在线电影观看免费视频| 久久精品亚洲AV久久久无码| 一个人免费观看www视频在线| 精品国产日韩久久亚洲| 卡一卡二卡三在线入口免费| 国产亚洲综合视频| 亚洲永久精品ww47| 8888四色奇米在线观看免费看| 亚洲性色高清完整版在线观看| 日韩一区二区a片免费观看| 亚洲av无码专区首页| 高清在线亚洲精品国产二区| 香蕉视频在线免费看| 亚洲国产综合专区在线电影| 99久久99久久精品免费看蜜桃| 亚洲妇女无套内射精| 亚洲精品和日本精品| 青青青国产手机频在线免费观看| 亚洲美女在线观看播放| 午夜私人影院免费体验区| 一级人做人a爰免费视频 | 免费无遮挡无遮羞在线看| 久久久久亚洲AV无码专区桃色| 久久国产乱子伦精品免费强| 亚洲五月丁香综合视频| 亚洲av无码乱码在线观看野外| 亚洲免费观看视频| 亚洲欧洲日产国码久在线| 亚洲综合国产精品第一页| 97在线视频免费播放| 狠狠综合亚洲综合亚洲色| 久久精品国产亚洲综合色| 手机在线看永久av片免费| 国产99视频精品免费视频76| 亚洲一区二区三区在线|