INFORMACE: Použití prostřednictvím #import v VC ++ ActiveX Data Objects (ADO)

Překlady článku Překlady článku
ID článku: 169496 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Direktiva #import v jazyce C++ nabízí výkonné nové mechanismus pro manipulaci s servery OLE. #Import použit s ADO (ActiveX Data Objects), lze zjednodušit získávání na data. Tento článek popisuje, co je nutné využít #import s ADO.

Další informace

Před při vytvoření instance libovolného třídy vytvořené podle #import

Je důležité Inicializace OLE před vytvořením jakékoli instance tříd vytvořen #import. Například následující kód je bezpečné, jako jej deklaruje inteligentní ukazatel #import inicializuje OLE a vytvoří instanci inteligentní ukazatel:

   // Declare smart pointer of Recordset
    _RecordsetPtr     p;

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

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

      ...
   }
				
Další ukázka kódu však není bezpečné a generuje neošetřené výjimce. Globální ukazatel inteligentní p je deklarován i instance (podle virtue z konkrétní uuid předávání v konstruktoru):

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

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

      ...
   }
				
Protože p je globální proměnnou, je vytvořena před v main() se někdy nazývá CoInitialize. Můžete opravit s následující fragment kódu:
struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_;

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

   ...
				
Instance struct InitOle je deklarována instance před p a, tedy v jeho konstruktor inicializuje OLE. Bez tohoto druhu odolného proti selhání zobrazí se následující chybová zpráva:
Neošetřená výjimka v [programu] (KERNEL32.DLL): 0xE06D7363
Microsoft C++ výjimka.

Správné implementaci #import

Je důležité správně vyvolat ADO v programu nebo mají chyby kompilátoru. Následující kód znázorňuje správný způsob použití #import s Msado10.dll MSADO15.dll:

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

Zpracování chyb

S ADO může získat chybě v HRESULT vrácené z metody ADO, může získat výjimku aktivovaná #import generovány tříd a pro některá podmínka může být naplněna kolekce chyby ADO. Chcete-li získat na kolekce chyby nutné objekt platné připojení. Další informace naleznete v následujícím článku databáze Microsoft Knowledge Base:

169498INFORMACE: Soubor Error Information z ADO v VC ++ s #import

ADO a Dbdaoint.h

Pokusí se způsobem smíchat ADO (prostřednictvím #import) a MFC DAO nebo DAO SDK ve stejném souboru implementace:

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

  #import <msado15.dll> no_namespace ...
				

Generuje šest následující chyby:

Chyba C2011: 'EditModeEnum': 'výčtu zadejte předefinováním
Chyba C2011: 'LockTypeEnum': 'výčtu zadejte předefinováním
Chyba C2011: 'FieldAttributeEnum': 'výčtu zadejte předefinováním
Chyba C2011: 'DataTypeEnum': 'výčtu zadejte předefinováním
Chyba C2011: 'ParameterDirectionEnum': 'výčtu zadejte předefinováním
Chyba C2011: 'RecordStatusEnum': 'výčtu zadejte předefinováním
Při velmi téměř shodných v obsahu, se liší skutečné hodnoty každý Výčtový typ mezi co vyžadované ADO a co vyžadované DAO. Máte několik možností vyřešit:

  • Samostatné ADO a DAO kód do samostatných cpp souborů. Zachovat použití #import nebo # zahrnout i soubory samostatné implementace <afxdao.h/dbdao.h>.
  • Upravit příkaz #import vytvořit obor názvů pro nic generovány ADO. To znamená, budete mít při odkazování na objekt ADO, jak je znázorněno níže dvě funkce odkazovat oboru názvů. První ukazuje, jak použít ADO výhradně v rámci funkce. Druhý zobrazí jak kombinaci a shodu objekty ADO a DAO. To je možné pouze pomocí explicitně odkazující ADO obor názvů pro třídy ADO nebo Výčtový 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 soubory Msado105.tlh a Msado15.tli mimo typelib obsažené v Msado15.dll. Struktura souboru .tlh odhalení lze následovně:
  • Dopředné odkazy a Typedefs
  • Definice typu inteligentní ukazatel a deklarací
  • Typ položky knihovny
Každý je podrobně popsáno v níže.

Dopředné odkazy a Typedefs

Dopředné odkazy a Typedefs jsou vytvořeny prostřednictvím použití z __declspec(uuid("...")) struct na GUID pro jakékoli Dual Interface, rozhraní, a CoClass definované v 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;
   ...
				
Ne všechny rozhraní například připojení, mají více implementacemi. To závisí typelib, ale pro ADO většina rozhraní jsou duální a není implementované jako rozhraní nebo coclass.

Inteligentní deklarační TypeDef ukazatel

Pro rozhraní a rozhraní Dual inteligentní ukazatele jsou deklarovány, což výrazně zjednodušuje pomocí rozhraní:
   ...
   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
   ...
   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));
   ...
				
Poznámka, že byl pro coclass rozhraní deklarován žádný inteligentní ukazatel.

Typ položky knihovny

To zahrnuje všechny Výčtové typy definované v typelib, jako dobře implementace inteligentní ukazatelů a typelib položek:

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 předchozím fragment kódu používá vlastnost datové části declspec deklarovat get a umístit metod ConnectionString. V části metody Wrapper poskytuje metody vytvořen #import, které zalomit tyto metody a vyvolat výjimku _com_error, pokud nejsou úspěšné. Oddíl nezpracovaných metody deklaruje skutečné metodu, která je vyvoláno rozhraní.

Zatímco by volání GetConnectionString nebo PutConnectionString, je skutečně zbytečné. Protože je vlastnost ConnectionString je by je odkaz takto:

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


Skutečná implementace GetConnectionString/PutConnectionString lze nalézt v souboru Msado15.tli.

Pokud pochází čas v kódu pomocí objektu Connection, použijete instanci inteligentní ukazatel pro duální rozhraní definovány v Msado15.tlh následujícím způsobem:

   _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 pubs je zdroj dat ODBC.

#Import a výslovně volání Release()

Výhodou #import je, že jej činnostem AddRef, QueryInterface a vydání můžete automaticky. Však Pokud se rozhodnete spustit volání Release() explicitně, můžete vytvořit problémy pro sebe.

V rámci _com_ptr_t je proměnná, m_pInterface člen. Je velmi tenký souhrnný #import díky žádné rozdílu s m_pInterface po objekt je ve skutečnosti vydání versus pouze snížení jeho odkaz spočítat bez skutečně zničení objektu. Explicitně voláním verze ()--bez velmi explicitně volající AddRef() zůstatek je--#import gladly pokusu uvolnit objekt, který neexistuje, vytváření zajímavých efektů straně a crashing chování.

Doporučené rady není AddRef() jej (nebo alespoň není nutné), není uvolněte jej buď.

Odkazy

  • Vnitřní cz podle Dale Rogerson ISBN: 1-57231-349-8
  • OLE COM Object prohlížeč (Oleview.exe) dodávaný s Visual C++ pro prověřování obsahu typelib.
  • Visual C++ dokumentaci online: hledání #import
Další informace naleznete v následujících článcích znalostní báze Microsoft Knowledge Base:
182389FILE: Adovcbm.exe ADO 1.5 s #import a getrows/záložky
184968FILE: Adovcsp.exe ukázáno použití uložených procedur s ADO
186387UKÁZKOVÝ: Ado2atl.exe vrátí rozhraní ADO z COM
181733FILE: Adovcbtd.exe #import UpdateBatch použití a CancelBatch
166112PRB: Konflikt s EOF při použití s ADO #import
168354INFORMACE: Podúrovně OLE a OLEDB Provider chyby jsou zpřístupněná through ADO

Vlastnosti

ID článku: 169496 - Poslední aktualizace: 2. března 2005 - Revize: 3.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft ActiveX Data Objects 1.0 na těchto platformách
    • 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 na těchto platformách
    • 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 na těchto platformách
    • 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 na těchto platformách
    • 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 na těchto platformách
    • 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 na těchto platformách
    • 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
Klíčová slova: 
kbmt kbcode kbdatabase kbinfo kbusage KB169496 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:169496

Dejte nám zpětnou vazbu

 

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