INFORMAZIONI: Utilizzo di ActiveX Data Objects (ADO) tramite # import in VC ++

Traduzione articoli Traduzione articoli
Identificativo articolo: 169496 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

La direttiva # import in Visual c ++ offre un nuovo meccanismo potente per la gestione dei server OLE. Quando utilizzato con oggetti ADO (ActiveX Data Objects), # import consente di semplificare ottenere i dati. In questo articolo viene descritto che cosa Ŕ necessario per sfruttare # import con ADO.

Informazioni

Prima di creare un'istanza di qualsiasi classi create da # import

╚ importante per l'inizializzazione OLE prima di creare le istanze di classi create tramite # import. Ad esempio, il codice riportato di seguito Ŕ sicuro, dichiara un puntatore intelligente # Import, Inizializza OLE e quindi crea un'istanza il puntatore intelligente:

   // Declare smart pointer of Recordset
    _RecordsetPtr     p;

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

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

      ...
   }
				
Esempio di codice successiva, tuttavia, non Ŕ sicuro e genera un'eccezione non gestita. Il puntatore intelligente globale p Ŕ sia dichiarato e creata un'istanza (in virt¨ nel costruttore, passando un uuid specifico):

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

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

      ...
   }
				
PoichÚ p Ŕ una variabile globale, viene creata un'istanza prima di chiamata CoInitialize mai in main(). ╚ possibile risolvere il problema con il frammento di codice riportato di seguito:
struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_;

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

   ...
				
Un'istanza della struttura InitOle viene dichiarata, creata un'istanza prima di p e, di conseguenza, Inizializza OLE nel relativo costruttore. Senza questo tipo di modalitÓ provvisoria, si verrÓ visualizzato il seguente messaggio di errore:
Eccezione non gestita in [programma] (Kernel32.dll): 0xE06D7363
Eccezione di Microsoft c ++.

Correggere l'implementazione di # import

╚ importante richiamare ADO correttamente nel programma, che Ŕ possibile impostare gli errori del compilatore. Nel codice riportato di seguito illustra il modo corretto per utilizzare # import con Msado10.dll il Msado15.dll:

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

Gestione degli errori

Con ADO, si potrebbe essere visualizzato un errore in HRESULT restituito da un metodo di ADO, Ŕ possibile ottenere un'eccezione generata dalle classi di # import generato e per entrambe le condizioni dell'insieme di errori di ADO pu˛ essere compilato. Per ottenere l'insieme di errori Ŕ necessario un oggetto di connessione valida. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:

169498INFORMAZIONI: Estrazione di informazioni sugli errori di ADO in VC ++ con # import

ADO e Dbdaoint.h

Tenta di combinare ADO (tramite # import) e DAO MFC o il SDK di DAO nello stesso file di implementazione, come illustrato di seguito:

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

  #import <msado15.dll> no_namespace ...
				

Genera i seguenti sei errori:

Errore C2011: 'EditModeEnum': ridefinizione tipo di 'enum'
Errore C2011: 'LockTypeEnum': ridefinizione tipo di 'enum'
Errore C2011: 'FieldAttributeEnum': ridefinizione tipo di 'enum'
Errore C2011: 'DataTypeEnum': ridefinizione tipo di 'enum'
Errore C2011: 'ParameterDirectionEnum': ridefinizione tipo di 'enum'
Errore C2011: 'RecordStatusEnum': ridefinizione tipo di 'enum'
Mentre molto quasi identico nel contenuto, i valori effettivi in ogni tipo enumerato differiscono tra ci˛ che Ŕ richiesto da ADO e che cosa Ŕ necessario per DAO. Sono disponibili diverse opzioni per risolvere questo problema:

  • ADO e DAO codice separato nel file cpp separato. # Include <afxdao.h/dbdao.h> nei file di implementazione separata nonchÚ o mantenere l'utilizzo di # Import.
  • Modificare l'istruzione # import per creare uno spazio dei nomi per le operazioni generate per ADO. Questo pertanto che Ŕ necessario fare riferimento lo spazio dei nomi quando si fa riferimento un oggetto ADO come illustrato in seguito le due funzioni. Il primo viene illustrato come utilizzare ADO esclusivamente all'interno di una funzione. Il secondo mostra come oggetti ADO e DAO combinazione la corrispondenza. Ci˛ Ŕ possibile solo da riferimento in modo esplicito la spazio dei nomi ADO per qualsiasi classe di ADO o di un tipo enumerato:

       #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;
          }
    						
Msado105.tlh/Msado15.tli dissecting e utilizzare--------------------------------------------

# import genera due file, Msado105.tlh e Msado15.tli della libreria dei tipi contenuto Msado15.dll. La struttura del file TLH pu˛ essere suddivisa come indicato di seguito:
  • Inoltro di riferimenti e typedef
  • Smart Typedef di puntatori e dichiarazioni
  • Elementi di tipo raccolta
Ciascuna Ŕ descritta dettagliatamente di seguito.

Inoltro di riferimenti e typedef

Diretta riferimenti e i typedef vengono creati mediante l'utilizzo di una struttura __declspec(uuid("...")) sul GUID per qualsiasi Dual Interface, interfaccia, e CoClass definito nella libreria dei tipi.

   ...
   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))
   /* dual interface */ _Connection;
   ...
   struct __declspec(uuid("00000275-0000-0010-8000-00aa006d2ea4"))
   /* interface */ ICADOConnection;
   ...
   struct /* coclass */ Connection;
   ...
				
Non tutte le interfacce, ad esempio connessione, dispongono di pi¨ implementazioni. Questo dipende dalla libreria dei tipi, ma per ADO la maggior parte delle interfacce sono in doppio e non implementato come interfaccia o di coclasse.

Smart dichiarazioni TypeDef di selezione

Per interfacce e le interfacce duali, vengono dichiarati puntatori intelligenti, che semplifica notevolmente utilizzando l'interfaccia:
   ...
   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
   ...
   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));
   ...
				
si noti che nessun puntatore intelligente Ŕ stato dichiarato per la coclasse interfaccia di connessione.

Elementi di tipo raccolta

Questo include di qualsiasi tipo enumerato definito nella libreria dei tipi, come implementazione e di puntatori intelligenti e gli elementi della libreria dei tipi:

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;
      ...
   };
				
Nel frammento di codice precedente, la sezione ProprietÓ dati utilizza declspec per dichiarare get e inserire i metodi per ConnectionString. La sezione metodi di wrapper fornisce metodi creati da # import, Ŕ possibile che questi metodi di a capo e generano un'eccezione di _com_error se non sono riuscite. La sezione metodi RAW dichiara il metodo effettivo che viene richiamato dall'interfaccia.

Mentre Ŕ possibile chiamare GetConnectionString o PutConnectionString, non Ŕ realmente necessario. Trattandosi di una proprietÓ ConnectionString Ŕ necessario che il riferimento come indicato di seguito:

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


L'implementazione effettiva di GetConnectionString/PutConnectionString Ŕ reperibile nel file Msado15.tli.

Si tratta di tempo per utilizzare l'oggetto Connection nel codice, si utilizzerÓ un'istanza del puntatore intelligente per l'interfaccia duale definita in Msado15.tlh come segue:

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


Dove pubs Ŕ un'origine dati ODBC.

# Import e Release() chiamata esplicita

Il vantaggio di # import Ŕ che esso si occupa di AddRef, QueryInterface e versione Ŕ automaticamente. Tuttavia, se si decide di avviare la chiamata Release() in modo esplicito, Ŕ possibile creare problemi per se stessi.

All'interno di _com_ptr_t Ŕ m_pInterface di variabile, un membro. # Import Ŕ un wrapper molto sottile, non consente di alcuna differenza con m_pInterface dopo l'oggetto viene effettivamente rilasciato, e decremento solo il riferimento conteggio senza effettivamente distruggere l'oggetto. Chiamando in modo esplicito Release ()--senza AddRef() chiamata molto in modo esplicito per bilanciare # import Ŕ--gladly tenterÓ rilasciare un oggetto che non esiste, creazione di interessanti effetti collaterali e il comportamento di arresto anomalo.

Consiglio di procedure, Ŕ stato eseguito non AddRef() Ŕ (o almeno non Ŕ necessario), non rilasciarla sia.

Riferimenti

  • Inside COM da Dale Rogerson ISBN 1-57231-349-8
  • Il OLE Visualizzatore oggetti COM (Oleview.exe) fornito con Visual c ++ per esaminare il contenuto di una libreria dei tipi.
  • Documentazione in linea di Visual c ++: ricerca di # import
Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportati di seguito:
182389FILE: Adovcbm.exe ADO 1.5 con # import e getrows/segnalibri
184968FILE: Adovcsp.exe dimostrazione dell'utilizzo di stored procedure con ADO
186387ESEMPIO: Ado2atl.exe restituisce interfacce ADO da COM
181733FILE: # Import Adovcbtd.exe utilizzo UpdateBatch e CancelBatch
166112PRB: Conflitti con EOF quando si utilizza # import con ADO
168354INFORMAZIONI: OLE sottostante e di errori del provider OLE DB vengono esposti tramite ADO

ProprietÓ

Identificativo articolo: 169496 - Ultima modifica: mercoledý 2 marzo 2005 - Revisione: 3.2
Le informazioni in questo articolo si applicano a:
  • Microsoft ActiveX Data Objects 1.0áalle seguenti piattaforme
    • 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áalle seguenti piattaforme
    • 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áalle seguenti piattaforme
    • 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áalle seguenti piattaforme
    • 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áalle seguenti piattaforme
    • 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áalle seguenti piattaforme
    • 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
Chiavi:á
kbmt kbcode kbdatabase kbinfo kbusage KB169496 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 169496
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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