INFO: Pomocou ActiveX Data Objects (ADO) cez #import v VC ++

Preklady článku Preklady článku
ID článku: 169496 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

Smernica o #import v Visual C++ ponúka výkonné nový mechanizmus pre manipuláciou serverov OLE. Pri použití s ActiveX Data Objects (ADO), #Import môže zjednodušiť získanie vašich údajov. Tento článok sa zaoberá, čo je potrebné využiť #import s ADO.

DALSIE INFORMACIE

Pred môžete vytvoriť inštanciu akejkoľvek triedy vytvoril #import

Je dôležité sa inicializovať OLE pred vytvorením všetky inštancie triedy vytvoril #import. Napríklad nasledujúci kód je v bezpečí, ako deklaruje #import inteligentné ukazovateľ, inicializuje OLE, a potom instantiates smart ukazovateľ:

   // Declare smart pointer of Recordset
    _RecordsetPtr     p;

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

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

      ...
   }
				
Nasledujúci kód vzorky, však nie je bezpečné a vytvára neošetrená výnimka. Globálne inteligentné ukazovateľ p je aj deklarované vytvorená inštancia ( titulu prechádzajúcich špecifické uuid v konštruktéra):

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

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

      ...
   }
				
Pretože p je globálna premenná, to je vytvorená inštancia pred CoInitialize je niekedy nazýva v main(). Môžete to opraviť s nasledujúci kód úryvok:
struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_;

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

   ...
				
Inštancia struct InitOle je deklarovaný a vytvorená inštancia pred p, a preto initializes OLE v jeho konstruktoru. Bez tohto druhu z príklopmi, zobrazí sa nasledovné chybové hlásenie:
Neošetrená výnimka v [Program] (KERNEL32.DLL): 0XE06D7363
Microsoft C++ výnimku.

Správne vykonávanie #import

Je dôležité na vyvolanie ADO správne v programe, alebo môžete mať kompilátor chyby. Nasledujúci kód ukazuje správny spôsob použitia #import s Msado10.dll MSADO15.dll:

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

Chyba Manipulácia

S ADO, môžu dostať chybu v HRESULT vrátil z metódu ADO môže dostať výnimku vznesené #import generované tried, a pre buď podmienka kolekcii ADO chyby môžu obývaných. S cieľom Získajte na chyby zbierky potrebujete platné pripojenie objekt. Pre viac informácií pozri článok v databáze Microsoft Knowledge Base:

169498 INFO: Extrakcia informácie o chybách ADO v VC ++ s #import

ADO a Dbdaoint.h

Pokúsi zmiešajte ADO (pomocou #import) a MFC DAO alebo DAO SDK v súbore istého realizáciu takto:

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

  #import <msado15.dll> no_namespace ...
				

Vygeneruje nasledujúcich šesť chýb:

Chyba C2011: "EditModeEnum": "enum" zadajte predefinovanie
Chyba C2011: "LockTypeEnum": "enum" zadajte predefinovanie
Chyba C2011: "FieldAttributeEnum": "enum" zadajte predefinovanie
Chyba C2011: "DataTypeEnum": "enum" zadajte predefinovanie
Chyba C2011: "ParameterDirectionEnum": "enum" zadajte predefinovanie
Chyba C2011: "RecordStatusEnum": "enum" zadajte predefinovanie
Zatiaľ čo veľmi takmer identické v obsahu, skutočné hodnoty v každom vymenované typ líšia medzi čo takto vyžadujú ADO a čo je potrebné Autor: DAO. Máte niekoľko možností obísť toto:

  • Samostatné ADO a DAO kód do samostatných .cpp súborov. Udržať používanie #import alebo # zahrnúť <afxdao.h bdao.h="">do samostatnej implementačnej súbory ako aj.</afxdao.h>
  • Upraviť vyhlásenie #import na vytvorenie priestoru názvov na čokoľvek generované pre ADO. To znamená, budete mať na odkaz priestor názvov pri uvádzaní objekt ADO, ako je znázornené na dve funkcie nižšie. Prvý ukazuje, ako používať ADO výlučne v rámci funkcie. Druhá ukazuje ako objekty ADO a DAO premiešajte a zápas. To je možné len do výslovne odkazovanie ADO namespace pre akékoľvek ADO trieda alebo vymenované typ:

       #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 a použitím Msado105.tlh/Msado15.tli--------------------------------------------

#Import generuje dva súbory, Msado105.tlh a Msado15.tli z typelib obsiahnuté v rámci Msado15.dll. Štruktúra súboru .tlh môže rozdelené takto:
  • Dopredu odkazy a definície TYPEDEF
  • Smart ukazovateľ Typedef a vyhlásenia
  • Typ knižnice položiek
Každá je popísané nižšie.

Dopredu odkazy a definície TYPEDEF

Dopredu odkazy a definície TYPEDEF sú vytvorené prostredníctvom uplatňovania struct __declspec(UUID("...")) na identifikátor GUID pre každé duálne rozhranie, rozhranie, a CoClass definované v zozname typelib.

   ...
   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))
   /* dual interface */ _Connection;
   ...
   struct __declspec(uuid("00000275-0000-0010-8000-00aa006d2ea4"))
   /* interface */ ICADOConnection;
   ...
   struct /* coclass */ Connection;
   ...
				
Nie všetky rozhrania, napríklad pripojenie, mať viacero implementácií. To záleží na zozname typelib, ale pre ADO sú duálne väčšina rozhraní a nie implementovaný ako rozhranie alebo coclass.

Inteligentné ukazovateľ TypeDef vyhlásenia

Pre rozhrania a duálne rozhranie, smart ukazovatele sú deklarované, ktoré ve?mi zjednodušuje použitím rozhrania:
   ...
   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
   ...
   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));
   ...
				
Všimnite si, že žiadne inteligentné ukazovateľ bol vyhlásený za pre coclass pripojenie rozhranie.

Typ knižnice položiek

Toto zahŕňa akýkoľvek enumerované typy definované v zozname typelib, ako aj implementácia smart ukazovatele a typelib položiek:

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;
      ...
   };
				
V predchádzajúcom fragment kódu sekcii vlastníctva údajov používa declspec na vyhlásenie get a dať metódy pre ConnectionString. Metódy Wrapper časť poskytuje metódy vytvorené #import, ktoré Zalomiť tieto metódy a vyvolať výnimku _com_error, ak nie sú úspešné. Neupravený Metódy oddiel vyhlasuje skutočné metóda, ktorá je vzývaný rozhranie.

Zatiaľ čo si mohol zavolať, GetConnectionString alebo PutConnectionString, je naozaj zbytočné. Pretože ConnectionString je vlastnosť by ste referenčné takto:

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


Môže byť skutočná realizácia GetConnectionString/PutConnectionString nájsť v súbore Msado15.tli.

Keď príde čas na použitie objektu pripojenia vo vašom kód, použite inštancia inteligentné ukazovateľ pre duálne rozhranie definované v Msado15.tlh takto:

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


Kde krčmy je zdroj údajov ODBC.

#Import a výslovne volá Release()

Výhodou #import je, že sa stará o AddRef, funkcie QueryInterface, a správa pre vás automaticky. Avšak, ak ste sa rozhodli začať volanie Release() výslovne, môžete vytvoriť problémy pre seba.

V rámci _com_ptr_t je člen premennej, m_pInterface. #Import je veľmi tenký obal, nie je žiaden rozdiel s m_pInterface po objekt je skutočne uvoľnené verzus len odčitovacie svoj odkaz počítať bez skutočne ničí objektu. Explicitne volaním uvoľniť ()--bez radi sa pokúsi veľmi výslovne volajúci AddRef() na vyváženie it--#import uvoľniť objekt, ktorý neexistuje, vytváranie zaujímavé vedľajšie účinky a shazovat správanie.

Najlepšie radu, ste nie AddRef() to (alebo aspoň nie je potreba), nezbavuje to buď.

ODKAZY

  • Vnútri KOM do Dale Rogerson ISBN 1-57231-349-8
  • OLE-COM Object zobrazovača (Oleview.exe) že lode s Visual C++ za preskúmanie obsahu typelib.
  • Visual C++ online dokumentácia: vyhľadávanie na #import
Dodatočné informácie, po kliknutí na nasledovné čísla článkov databázy Microsoft Knowledge Base:
182389 SÚBOR: Adovcbm.exe ADO 1.5 s #import a funkcia Getrows/záložky
184968 SÚBOR: Adovcsp.exe dokazuje použitím uložené postupy s ADO
186387 VZORKA: Ado2atl.exe vráti ADO rozhrania COM
181733 SÚBOR: Adovcbtd.exe #import pomocou UpdateBatch a CancelBatch
166112 PRB: Konflikt s EOF pri použití #import s ADO
168354 INFO: Podkladových OLE a OLEDB poskytovateľ chyby sú vystavené prostredníctvom ADO

Vlastnosti

ID článku: 169496 - Posledná kontrola: 18. októbra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Data Access Components 2.7
Kľúčové slová: 
kbcode kbdatabase kbinfo kbusage kbmt KB169496 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:169496

Odošlite odozvu

 

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