Information: Verwenden ActiveX Data Objects (ADO) über # Import in VC++

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 169496 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Die # Import-Direktive in Visual C++ bietet einen leistungsfähigen neuen Mechanismus zum Bearbeiten von OLE-Server. Mit ActiveX Data Objects (ADO) verwendet, vereinfachen die # Import Ihrer Daten abrufen. Dieser Artikel beschreibt was # Import mit ADO nutzen erforderlich ist.

Weitere Informationen

Bevor Sie instanziieren alle Klassen erstellt durch # Import

Es ist wichtig OLE initialisieren, bevor Sie alle Instanzen von Klassen, die durch # Import erstellt erstellen. Der folgende Code ist z. B. sicher, es einen intelligenter Zeiger # Import deklariert, initialisiert OLE und instanziiert intelligenten Zeiger:

   // Declare smart pointer of Recordset
    _RecordsetPtr     p;

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

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

      ...
   }
				
Im nächste Codebeispiel jedoch ist nicht sicher und eine unbehandelte Ausnahme generiert. Globale intelligente Zeiger p ist sowohl deklariert und instanziiert (aufgrund von einer bestimmten Uuid im Konstruktor übergeben):

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

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

      ...
   }
				
Da p eine globale Variable ist, wird er instanziiert, bevor CoInitialize jemals in main() aufgerufen wird. Sie können dies korrigieren, mit dem folgenden Codeausschnitt:
struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_;

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

   ...
				
Eine Instanz der Struktur InitOle deklariert ist, und bevor p instanziiert, und daher in seinem Konstruktor initialisiert OLE. Ohne diese Art von ausfallsicheres sehen Sie die folgende Fehlermeldung:
Nicht behandelte Ausnahme in [Programme] (Kernel32.dll): 0xE06D7363
Microsoft C++-Ausnahme.

Richtige Implementierung von # Import

Es ist wichtig, ADO korrekt in Ihrem Programm aufrufen, oder Sie können Compilerfehler über. Der folgende Code veranschaulicht, wie von # Import mit Msado10.dll die MSADO15.dll ordnungsgemäß:

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

Fehlerbehandlung

Mit ADO Sie möglicherweise eine Fehlermeldung in das von einer ADO-Methode zurückgegebene HRESULT, erhalten Sie möglicherweise eine Ausnahme von # Import generierten Klassen und entweder Bedingung kann ADO Errors-Auflistung aufgefüllt werden. Um bei der Errors-Auflistung abgerufen werden, benötigen Sie eine gültige Connection-Objekt. Weitere Informationen finden Sie in der folgenden Artikel der Microsoft Knowledge Base:

169498INFO: Extrahieren Fehlerinformationen aus ADO in VC++ mit # Import

ADO und Dbdaoint.h

Versucht, ADO (über # Import) und MFC-DAO- oder das DAO SDK in der gleichen Implementierungsdatei mischen Sie wie folgt:

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

  #import <msado15.dll> no_namespace ...
				

Die folgenden sechs Fehler generiert:

Fehler C2011: 'EditModeEnum': 'Enumeration' Typneudefinition
Fehler C2011: 'LockTypeEnum': 'Enumeration' Typneudefinition
Fehler C2011: 'FieldAttributeEnum': 'Enumeration' Typneudefinition
Fehler C2011: 'DataTypeEnum': 'Enumeration' Typneudefinition
Fehler C2011: 'ParameterDirectionEnum': 'Enumeration' Typneudefinition
Fehler C2011: 'RecordStatusEnum': 'Enumeration' Typneudefinition
Während im Inhalt sehr nahezu identisch, unterschiedlich der tatsächlichen Werte in jeder Enumerationstyp was von ADO erforderlich ist und welche DAO erforderlich ist. Sie haben mehrere Möglichkeiten, dies zu umgehen:

  • Separaten ADO und DAO-Code in separaten CPP-Dateien. Halten Sie die Verwendung von # Import oder # include <afxdao.h/dbdao.h> in separate Implementierungsdateien sowie.
  • Ändern Sie die Anweisung # Import, so dass ausschließlich für ADO generiert für einen Namespace erstellen. Dies bedeutet, Sie auf den Namespace verweisen, wenn ein ADO-Objekt in die beiden Funktionen unten dargestellten verweisen müssen. Die erste veranschaulicht, wie ADO ausschließlich innerhalb einer Funktion zu verwenden. Das zweite zeigt wie ADO und DAO-Objekte mischen und übereinstimmen. Dies ist möglich, nur durch explizit verweisen auf den ADO-Namespace für alle ADO-Klasse oder Enumerationstyp:

       #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 und Verwenden von Msado105.tlh/Msado15.tli--------------------------------------------

# Import generiert zwei Dateien, Msado105.tlh und Msado15.tli aus der Typbibliothek enthaltenen msado15.dll. Die Struktur der TLH-Datei kann wie folgt aufgeteilt werden:
  • Forward Verweise und Typdefinitionen
  • Intelligente Zeiger TypeDef und Deklarationen
  • Typ-Bibliothek Objekte
Jede wird nachstehend ausführlich beschrieben.

Forward Verweise und Typdefinitionen

Forward Verweise und Typdefinitionen werden mithilfe der Struktur __declspec(uuid("...")) auf der GUID für alle Dual Interface, Schnittstelle, erstellt und CoClass in der Typbibliothek definiert.

   ...
   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))
   /* dual interface */ _Connection;
   ...
   struct __declspec(uuid("00000275-0000-0010-8000-00aa006d2ea4"))
   /* interface */ ICADOConnection;
   ...
   struct /* coclass */ Connection;
   ...
				
Nicht alle Schnittstellen, wie z. B. Verbindung haben mehrere Implementierungen. Dies hängt von der Typbibliothek, für ADO die meisten Schnittstellen sind jedoch zwei und nicht implementiert als Schnittstelle oder Co-Klasse.

Intelligente Zeiger TypeDef-Deklarationen

Für Schnittstellen und duale Schnittstellen intelligente Zeiger werden deklariert, die wird erheblich vereinfacht mithilfe der Benutzeroberfläche:
   ...
   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
   ...
   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));
   ...
				
beachten, dass kein intelligenter Zeiger für die Schnittstelle Verbindung Co-Klasse deklariert wurde.

Typ-Bibliothek Objekte

Dies umfasst alle Enumerationstypen, die in der Typbibliothek als auch Implementierung der intelligenten Zeigern und Typelib-Elemente definiert:

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;
      ...
   };
				
Im vorherigen Codefragment verwendet der Abschnitt Eigenschaft Daten Declspec um Get deklarieren und legen Sie die Methoden für ConnectionString. Der Wrapper Methoden Abschnitt enthält Methoden, die durch # Import, erstellt diese Methoden umbrochen, und eine _com_error Ausnahme auslösen, wenn Sie nicht erfolgreich sind. Abschnitt RAW Vorgehensweisen deklariert die aktuelle Methode, die durch die Schnittstelle aufgerufen wird.

Während Sie GetConnectionString oder PutConnectionString aufrufen konnte, ist es eigentlich nicht erforderlich. Da eine Eigenschaft ConnectionString würden Sie wie folgt verweisen:

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


Die eigentliche Implementierung GetConnectionString-PutConnectionString finden Sie in der Datei Msado15.tli.

Wenn das Verbindungsobjekt in Ihrem Code verwenden, würden Sie eine Instanz des intelligenten Zeiger für die duale Schnittstelle im Msado15.tlh wie folgt definiert verwenden:

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


Wo ist Pubs eine ODBC-Datenquelle.

# Import und explizites Aufrufen von Release()

Der Vorteil von # Import ist, dass es QueryInterface, AddRef und Release für Sie automatisch übernimmt. Wenn Sie explizit aufrufen von Release() starten möchten, können Sie jedoch Probleme für sich selbst erstellen.

Eine Variable, Member M_pInterface ist innerhalb _com_ptr_t. # Import einer sehr einfachen Wrapper ist, macht es keine Unterscheidung mit M_pInterface, nachdem das Objekt im Vergleich zu nur dekrementiert den Verweiszähler ohne das Objekt zu zerstören tatsächlich freigegeben ist. Durch Aufrufen von explizit freigeben versucht ()--ohne sehr explizit aufrufen AddRef() zum Ausgleichen von es--# Import gladly, ein Objekt freigeben, die nicht existiert, Erstellen von interessanten Nebeneffekte und abstürzenden Verhalten.

Empfohlene Empfehlung haben nicht AddRef() er (oder zumindest nicht erforderlich,), nicht es entweder.

Informationsquellen

  • Inside COM von Dale Rogerson ISBN 1-57231-349-8
  • Den OLE-COM-Objektkatalog (OLEView.exe), der ausgeliefert wird mit Visual C++ für den Inhalt einer Typenbibliothek untersuchen.
  • Visual C++-online-Dokumentation: Suche nach # Import
Weitere Informationen finden Sie folgenden Artikel der Microsoft Knowledge Base:
182389Datei: Adovcbm.exe ADO 1.5 mit # Import und GetRows-Lesezeichen
184968Datei: Adovcsp.exe demonstriert die Verwendung von gespeicherten Prozeduren mit ADO
186387Beispiel: Ado2atl.exe gibt die ADO-Schnittstellen aus COM
181733Datei: Adovcbtd.exe # Import mit UpdateBatch und CancelBatch
166112PRB: Konflikt mit EOF beim Verwenden von # Import mit ADO
168354INFO: Zugrunde liegenden OLE und OLEDB-Provider Fehler werden durch ADO Exposed

Eigenschaften

Artikel-ID: 169496 - Geändert am: Mittwoch, 2. März 2005 - Version: 3.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ActiveX Data Objects 1.0, wenn verwendet mit:
    • 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, wenn verwendet mit:
    • 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, wenn verwendet mit:
    • 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, wenn verwendet mit:
    • 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, wenn verwendet mit:
    • 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, wenn verwendet mit:
    • 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
Keywords: 
kbmt kbcode kbdatabase kbinfo kbusage KB169496 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 169496
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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