資訊: 透過 # import VC + + 中使用 ActiveX 資料物件 (ADO)

文章翻譯 文章翻譯
文章編號: 169496 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

# import 指示詞,Visual C++ 中的提供了強大的新機制來管理 OLE 伺服器。當使用具有 ActiveX 資料物件 (ADO),# import 可以簡化取得您的資料。本文將告訴您什麼是需要利用 # import 搭配 ADO。

其他相關資訊

# import 所建立的任何類別具現化之前

很重要的一點就是建立 # import 所建立的類別任何執行個體之前,先初始化 OLE。例如下列程式碼是安全,宣告 # import 智慧型指標、 初始化 OLE,並再執行個體化智慧型指標:

   // Declare smart pointer of Recordset
    _RecordsetPtr     p;

   void main( void )
   {
      // Initialize OLE.
      ::CoInitialize(NULL);

      // Instantiate smart pointer.
      HRESULT hr = p.CreateInstance( __uuidof( Recordset ) );

      ...
   }
				
下一個的程式碼範例不過,不安全,而且會產生未處理的例外狀況。全域的智慧型指標 p 同時宣告,然後執行個體化 (藉由的建構函式中傳遞特定 uuid) 優點:

// Declare & instantiate smart pointer of Recordset
    _RecordsetPtr     p( __uuidof( _Recordset ) );

   void main( void )
   {
      // Initialize OLE
      ::CoInitialize(NULL);

      ...
   }
				
因為 p 全域變數它是執行個體化之前 CoInitialize 曾經呼叫 main () 中。您可以使用下列程式碼片段來修正:
struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_;

   // Declare & instantiate smart pointer of Recordset
    _RecordsetPtr     p( __uuidof( _Recordset ) );

   ...
				
InitOle 結構的執行個體宣告並具現化之前 p,並,因此,初始化 OLE 在它的建構函式中。沒有這種自動防故障裝置,您會看到下列的錯誤訊息:
無法處理的例外狀況,在 [程式] (KERNEL32.DLL): 0xE06D7363
Microsoft C + + 例外狀況。

# import 的正確實作

重要在您的程式中正確地叫用 ADO 或有編譯器錯誤。下列程式碼會示範使用 # import Msado10.dll [MSADO15.dll 具有正確的方法:

   #import <msado15.dll>            \ 
   no_namespace                     \ 
  rename( "EOF", "adoEOF" )
				

錯誤處理

搭配 ADO 中從 ADO 方法傳回 HRESULT,,就可能會發生的錯誤的、 您可能會收到 # import 產生類別所引發例外狀況,任一個條件可能會填入 ADO 錯誤集合。若要在錯誤集合取得您需要一個有效的連接物件。如需詳細資訊,請參閱 「 Microsoft 知識庫 」 中下列文:

169498資訊: # import 與從 ADO VC + + 中擷取資訊時發生錯誤

ADO 和 Dbdaoint.h

嘗試混合 ADO (透過 # import) 與 MFC DAO 或 DAO SDK 在相同的實作檔,如下所示:

  #include <afxdao.h>  // MFC DAO
   // -or-
  #include <dbdao.h>   // DAO SDK

  #import <msado15.dll> no_namespace ...
				

會產生下列六種錯誤:

錯誤 C2011: 'EditModeEnum': '列舉' 輸入重複定義
錯誤 C2011: 'LockTypeEnum': '列舉' 輸入重複定義
錯誤 C2011: 'FieldAttributeEnum': '列舉' 輸入重複定義
錯誤 C2011: 'DataTypeEnum': '列舉' 輸入重複定義
錯誤 C2011: 'ParameterDirectionEnum': '列舉' 輸入重複定義
錯誤 C2011: 'RecordStatusEnum': '列舉' 輸入重複定義
雖然很幾乎完全相同的內容中,什麼所需的 ADO,以及什麼所需的 DAO 之間有所差異實際值在每個列舉型別。您有數個選項若要解決這個問題:

  • 個別 ADO 和 DAO 程式碼為個別的.cpp 檔案。保留 # import 使用或 # include <afxdao.h/dbdao.h> 也不同的實作檔案中。
  • 修改 # import 陳述式來建立命名空間的 ADO 為產生的任何項目。這表示您將需要參考兩個函式的下面所示的 ADO 物件時,參考命名空間。第一個示範如何使用 ADO 函式以獨佔模式中。 第二個顯示混合及符合 ADO 和 DAO 物件的方式。這是可能只是藉由明確參考 ADO 命名空間的任何 ADO 類別或列舉型別:

       #include <afxdao.h>
    
          #import <msado15.dll>                            \ 
                  rename_namespace("AdoNS") rename( "EOF", "adoEOF" )
    
          void ADOOnly( void )
          {
              using namespace AdoNS;
    
              _RecordsetPtr   prs;
    
              // Generates Compile Errors:
              CDaoRecordset   rs;
          }
    
          void MixAdoAndDao( void )
          {
              AdoNS::_RecordsetPtr  prs;
    
              // Compiles just fine
              CDaoRecordset   drs;
          }
    						
dissecting 且正在使用 Msado105.tlh/Msado15.tli--------------------------------------------

# import 會產生 Msado105.tlh 和 Msado15.tli 登出的 Msado15.dll 內包含型別程式庫的兩個檔案。.tlh 檔案的結構可以是按照,如下所示:
  • 向前參考和 typedefs
  • 智慧型指標 typedef 和宣告
  • 鍵入文件庫項目
每個中有詳細說明下面。

向前參考和 typedefs

向前參考及 Typedefs 建立透過結構 __declspec(uuid("...")) GUID 上的使用的任何雙重介面介面,並 CoClass 定義於該型別程式庫中。

   ...
   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))
   /* dual interface */ _Connection;
   ...
   struct __declspec(uuid("00000275-0000-0010-8000-00aa006d2ea4"))
   /* interface */ ICADOConnection;
   ...
   struct /* coclass */ Connection;
   ...
				
並非所有的介面連線,例如有多個實作。 這取決於型別程式庫,但 ADO 的大部分介面雙重且未實作為介面或 coclass。

智慧型指標 TypeDef 宣告

介面和雙重介面,智慧型指標宣告,這可以大幅簡化使用介面:
   ...
   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
   ...
   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));
   ...
				
請注意沒有智慧型指標被宣告的 coclass 連線介面。

鍵入文件庫項目

這包括定義在型別程式庫,康復實作的智慧型指標和型別程式庫項目為任何列舉型別:

enum CursorTypeEnum
   {
      adOpenUnspecified = -1,
      adOpenForwardOnly = 0,
      adOpenKeyset = 1,
      adOpenDynamic = 2,
      adOpenStatic = 3
   };

   ...

   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))
   _Connection : _ADO
   {
      // 
      // Property data.
      // 
      _declspec(property(get=GetConnectionString,
                         put=PutConnectionString))
      _bstr_t ConnectionString;
      ...

      // 
      // Wrapper methods for error-handling.
      // 
      _bstr_t GetConnectionString ( );
      void PutConnectionString (
          _bstr_t pbstr );
      ...

      // 
      // Raw methods provided by interface.
      // 
      virtual HRESULT __stdcall get_ConnectionString (
          BSTR * pbstr ) = 0;
      virtual HRESULT __stdcall put_ConnectionString (
          BSTR pbstr ) = 0;
      ...
   };
				
在前述的程式碼片段屬性資料] 區段會使用 declspec 來宣告 get 然後 ConnectionString 放方法。包裝函式方法區段提供 # import,所建立的方法包裝這些方法,並引發 _com_error 例外狀況,如果不成功。未經處理的方法區段宣告實際由介面所叫用的方法。

雖然您可以呼叫 GetConnectionString 或 PutConnectionString,但卻是真的不必要。因為 ConnectionString 屬性一樣,如下所示參考:

   bstrConnect = SysAllocString( L"DSN=AdoDemo;UID=admin;PWD=sa" );
   p->ConnectionString = bstrConnect;
				


實際實作 GetConnectionString/PutConnectionString 可找到 Msado15.tli 檔案中。

在您的程式碼中使用 [連線] 物件的時間時,您可以使用智慧型指標的執行個體雙重介面,如下所示 Msado15.tlh 中定義的:

   _ConnectionPtr p;
   bstrConnect
   HRESULT           hr = S_OK;
   _ConnectionPtr    pConn;

   hr = pConn.CreateInstance( __uuidof( Connection ) );

      if( !FAILED( hr ) )
         hr = pConn->Open( L"pubs", L"sa", L"" );
				


其中 pubs 是 ODBC 資料來源。

#Import 並明確地呼叫 Release()

# import 的優點是它會負責 AddRef、 QueryInterface 和發行為您自動。不過,如果決定啟動明確呼叫 Release() 您可以為自己建立問題。

內 _com_ptr_t 是成員變數,m_pInterface。因為 # import 極細的包裝函式物件實際發行之後,相對於其參考計數不需要實際終結物件的只是遞減使與 m_pInterface 沒有差別。 藉由明確地呼叫發行 ()--不以平衡它--# import 非常明確地呼叫 AddRef() gladly 會試著釋放物件並不存在,建立有趣的副作用和損毀的行為。

最佳的建議您已經做過不 AddRef() (或至少不需要)、 不要或是放開它。

?考

  • 由 Dale Rogerson ISBN 1-57231-349-8 的內部通訊
  • [OLE-COM 物件檢視器 (Oleview.exe) 的船 Visual C++ 檢查型別程式庫的內容。
  • Visual C++ 線上文件: # import 上的搜尋
如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
182389FILE: adovcbm.exe ADO 1.5 # import 與 getrows/書籤
184968FILE: adovcsp.exe 示範搭配 ADO 使用預存程序
186387範例: Ado2atl.exe 傳回 ADO 介面從 COM
181733使用 UpdateBatch 和 CancelBatch FILE: adovcbtd.exe # import
166112使用 EOF 搭配 ADO 使用 # import 時 PRB: 衝突
168354資訊: 基礎 OLE 與 OLEDB 提供者錯誤是透過公開 ADO

屬性

文章編號: 169496 - 上次校閱: 2005年3月2日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft ActiveX Data Objects 1.0?應用於:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Data Objects 1.5?應用於:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Data Objects 2.0?應用於:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Data Objects 2.1?應用於:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Data Objects 2.5?應用於:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft ActiveX Data Objects 2.6?應用於:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Data Access Components 2.7
關鍵字:?
kbmt kbcode kbdatabase kbinfo kbusage KB169496 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:169496
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com