日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

VC數據庫編程區分

VC數據庫編程區分

更新時間:2019-06-21 文章作者:未知 信息來源:網絡 閱讀次數:

作者: 胡朝暉

    我們知道,在VB下進行基于ADO的編程相對比較簡單,只要我們通過reference加載了適當的類型庫以后,我們就可以正常的調用ADO對象,但是可能很多開發人員對于VC下的基于ADO,OLE DB的數據庫開發就沒有很多經驗了。所以我們有必要先討論一下VC下基于ADO開發的幾種模式。

  VC下關于ADO的操作分析

  一般來說,用VC++有三種方法可以實現對ADO的操作:

  1. 通過#import方法

  2. 通過利用MFC OLE的ClassWizard

  3. 通過Windows API中COM相關的函數

在所有這三種方法種,#import是最方便的方法,它允許你產生一個類似VB的類結構。使你的開發變的很方便。

  #import方法

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

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

  一個實現文件(.tli)對類型庫對象模型中的方法產生封裝。

比如,你在stdafx.h文件中增加對msado15.dd的import以后,VC++會產生msado15.tlh和msado15.tli兩個文件。

  #import也能夠使用一個新的類,_com_ptr_t,也被稱為智能指針。智能指針能夠自動執行QuyerInterface,AddRef和Release函數。對一個COM對象模型使用#import產生代碼和VBA很類似。

  下面的代碼演示了如何使用#import在你的應用中實現對ADO的操作:

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

  no_namespace

  rename ( "EOF", "adoEOF" )

對EOF進行該名是必要的,因為典型的VC++應用都已經定義了EOF作為常數-1。

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

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

  _ConnectionPtr Conn1( __uuidof( Connection ) );

也可以采用下面的代碼實現同樣的功能

  _ConnectionPtr Conn1 = NULL; file://定義對象

  HRESULT hr = S_OK;

  hr = Conn1.CreateInstance( __uuidof( Connection ) ); file://創建實例

推薦采用第二種方法,因為如果用第一種方法的話不能返回一個失敗的HRESULT,所以也就不能判斷ADO連接對象是成功還是失敗。注意這里的__uuidof( Connection)中的Connection是在.tlh文件中定義的。通過把它傳遞給方法CreateInstance,實際上就是創建了一個有效的ADOConnection對象。

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

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

  #include

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

  void main()

   {

    HRESULT hr = S_OK;

    file://因為沒有在#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對象

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

    file://對hr的返回正確性判斷省略

    Rs1->Open( Source, Connect,

    ADODB::adOpenForwardOnly,

    ADODB::adLockReadOnly, -1 );

    file://這里可以對記錄集Rs1進行操作

    Rs1->Close();

    Rs1 = NULL;

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

    CoUninitialize();

   }

    用MFC OLE創建ADO應用

  MFC OLE類似于#import,能夠對一個類型庫產生一個封裝(wrapper),但是不象#import,MFC OLE不能夠從類型庫中產生枚舉類型,但是它能夠更干凈的實現ADO。MFC類CString和COleVariant隱藏了BSTRS和Variants的細節。需要注意的是,有MFC OLE產生的類封裝都是繼承了類ColeDispatchDriver,由ADO產生的失敗的HRESULTS被封裝在類ColeDispatchException中。

  首先我們需要說明一下用MFC OLE ClassWizard創建ADO應用的幾個不可缺少的步驟:

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

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

  下面的代碼是實現ADO應用的自己編寫的代碼:

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

  ...

  _Recordset Rs1; file://定義數據集對象

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

  COleVariant Source ( "SELECT * FROM Authors" );

  file://創建數據集對象

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

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

  file://這里可以對結果集Rs1進行處理

  Rs1.Close();

  Rs1.ReleaseDispatch();

  AfxMessageBox("Success!");

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

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

  為了能夠編譯用COM API創建的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://這里你可以對記錄集Rs1進行處理

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

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

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

  } 

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

本類教程下載

系統下載排行

主站蜘蛛池模板: 国产高清成人 | 好姑娘中文在线播放 | 国产成人在线精品 | 午夜影院在线看 | 国产成人亚洲精品 | 美女久久久久久 | 中文字幕一二三区 | 91免视频| 国产日本亚洲欧美 | 久久天天躁狠狠躁夜夜 | 99蜜臀噜噜噜在线视频观看 | 性欧美大战久久久久久久 | 午夜影院免费体验 | 不卡视频免费在线观看 | 黄色小说三级 | 中文天堂在线视频 | 亚洲成人在线免费视频 | 精品国产一区二区在线观看 | 五月深深爱| 国产小视频在线观看 | 欧美日韩在线成人免费 | 欧美999| 亚洲成aⅴ人片在线观 | 国产成人亚洲精品一区二区在线看 | 91中文字幕在线一区 | 国产精品久久久久影视不卡 | 在线观看免费视频 | 欧美一级做一级做片性十三 | 国产高清福利91成人 | 91在线免费看 | 欧美在线国产 | 青青青国产免费一夜七次郎 | 91色交视频| 国产精品男女 | 日本在线视频观看 | 女bbbbxxxx另类亚洲 | 四虎影永久在线观看精品 | 国产亚洲欧美一区二区三区 | 一区二区三区欧美日韩国产 | 亚洲欧洲日产v特级毛片 | 波多野结衣一区2区3区 |