欧美特黄不卡,涩涩视频在线,成人国产精品一区二区网站,亚洲一区二区三区欧美

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

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

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

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

作者: 胡朝暉

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

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

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

  1. 通過(guò)#import方法

  2. 通過(guò)利用MFC OLE的ClassWizard

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

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

  #import方法

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

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

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

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

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

  下面的代碼演示了如何使用#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ì)象

  通常來(lái)說(shuō),操作一個(gè)自動(dòng)化對(duì)象需要兩個(gè)步驟:定義和初始化一個(gè)用來(lái)操作COM對(duì)象的變量。通過(guò)#import你可以在一行代碼完成這個(gè)工作,通過(guò)使用智能指針(_com_ptr_t)的構(gòu)造函數(shù)傳遞一個(gè)有效的CLSID或者是PROGID。開(kāi)發(fā)人員也可以通過(guò)_com_ptr_t::CreateInstance()方法來(lái)定義對(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文件中定義的。通過(guò)把它傳遞給方法CreateInstance,實(shí)際上就是創(chuàng)建了一個(gè)有效的ADOConnection對(duì)象。

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

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

  #include

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

  void main()

   {

    HRESULT hr = S_OK;

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

    file://來(lái)作為變量類(lèi)型

    ADODB::_RecordsetPtr Rs1 = NULL;

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

  首先我們需要說(shuō)明一下用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類(lèi)型庫(kù)的路徑。

  從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ì)話框中,選擇所有列出的類(lèi)并按OK按紐,退出ClassWizard。實(shí)際上,ClassWizard為你生成了兩個(gè)文件msado15.h和msado15.cpp.

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

  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è)封裝類(lèi),它們分別繼承自_com_ptr_t和ColeDispatchDriver。但是事實(shí)上,你可以通過(guò)使用Windows API函數(shù)直接初始化ADO對(duì)象,下面討論直接用Win32 API函數(shù)來(lái)操作COM對(duì)象。
    用COM API創(chuàng)建ADO工程

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

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

  #include

  #include

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

  #include "adoint.h" // ADO的類(lèi)、枚舉等等

  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 );

  } 

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類(lèi)教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 镇原县| 红原县| 盘锦市| 盐源县| 阳东县| 隆昌县| 咸宁市| 饶阳县| 泗洪县| 黎平县| 陇西县| 常州市| 安宁市| 宝清县| 阜阳市| 山阳县| 镇宁| 新营市| 闸北区| 宿迁市| 凉山| 同德县| 广饶县| 台中县| 高州市| 潞城市| 历史| 安徽省| 泸定县| 启东市| 永济市| 巴林左旗| 光泽县| 会同县| 皋兰县| 肥城市| 湖北省| 乐平市| 大厂| 铁力市| 南开区|