ΠΛΗΡΟΦΟΡΙΕΣ: Χρήση ActiveX Data Objects (ADO) μέσω # Import σε VC ++

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 169496 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Η οδηγία # Import στην Visual C++ προσφέρει ένα ισχυρό μηχανισμό νέα χειρισμός διακομιστές OLE. Όταν χρησιμοποιείται με το ActiveX Data Objects (ADO), # Import μπορεί να απλοποιήσει τη λήψη δεδομένων σας. Αυτό το άρθρο περιγράφει τι είναι είναι απαραίτητο να εκμεταλλευτείτε # Import με το ADO.

Περισσότερες πληροφορίες

Πριν να ξεκινήσει οποιαδήποτε κλάσεις δημιουργήσατε # Import

Είναι σημαντικό να προετοιμάσουν το OLE πριν δημιουργήσετε τις παρουσίες κλάσεων δημιουργήθηκε από # Import. Για παράδειγμα, ο παρακάτω κώδικας είναι ασφαλή, όπως δηλώνει ένα έξυπνο δείκτη # 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, ενδέχεται να λάβετε ένα σφάλμα με το HRESULT επέστρεψε μια μέθοδο ADO, ενδέχεται να λάβετε μια εξαίρεση που προκαλείται από κλάσεις # Import που δημιουργήθηκαν και για μπορούν να συμπληρωθούν οι δύο συνθήκες της συλλογής Errors ADO. Για να λήψη στη συλλογή Errors, χρειάζεστε ένα αντικείμενο έγκυρη σύνδεση. Για περισσότερες πληροφορίες, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:

169498ΠΛΗΡΟΦΟΡΙΕΣ: Εξαγωγή πληροφοριών σφάλματος από το ADO σε VC ++ με # Import

Το ADO και Dbdaoint.h

Επιχειρεί να αναμείξετε ADO (μέσω # Import) και MFC DAO είτε το SDK DAO στο ίδιο αρχείο εφαρμογής, ως εξής:

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

  #import <msado15.dll> no_namespace ...
				

Δημιουργεί τα ακόλουθα έξι σφάλματα:

Σφάλμα C2011: 'editmodeenum': 'enum' πληκτρολογήστε επαναπροσδιορισμός
Σφάλμα C2011: «locktypeenum»: 'enum' πληκτρολογήστε επαναπροσδιορισμός
Σφάλμα C2011: 'fieldattributeenum': 'enum' πληκτρολογήστε επαναπροσδιορισμός
Σφάλμα C2011: 'datatypeenum': 'enum' πληκτρολογήστε επαναπροσδιορισμός
Σφάλμα C2011: 'parameterdirectionenum': 'enum' πληκτρολογήστε επαναπροσδιορισμός
Σφάλμα C2011: 'recordstatusenum': 'enum' πληκτρολογήστε επαναπροσδιορισμός
Ενώ πολύ σχεδόν όμοιες στο περιεχόμενο, οι πραγματικές τιμές σε κάθε απαριθμημένες διαφέρουν από αυτές που απαιτούνται από το ADO και τι απαιτείται από τα DAO. Έχετε διάφορες επιλογές για την επίλυση αυτού:

  • Ξεχωριστή κώδικα ADO και DAO .cpp ξεχωριστά αρχεία. Διατηρήστε τη χρήση # Import ή # περιλαμβάνουν <afxdao.h bdao.h="">ξεχωριστή εφαρμογή αρχεία ως κοιλότητα.</afxdao.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 μπορεί να χωριστεί ως εξής:
  • Προώθηση αναφορές και ΔΗΛΩΣΕΙΣ TypeDef
  • Έξυπνες Typedef δείκτη και δηλώσεις
  • Στοιχεία βιβλιοθήκης τύπου
Κάθε περιγράφεται λεπτομερώς παρακάτω.

Προώθηση αναφορές και ΔΗΛΩΣΕΙΣ TypeDef

Προώθηση αναφορές και ΔΗΛΩΣΕΙΣ TypeDef δημιουργούνται με χρήση της δομής __declspec(UUID("...")) από το GUID για οποιοδήποτε διπλής διασύνδεσης, περιβάλλον, και CoClass ορίζονται στο στοιχείο 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;
   ...
				
Οι διασυνδέσεις, όπως σύνδεση, έχετε πολλές υλοποιήσεις. Αυτό εξαρτάται από τη βιβλιοθήκη τύπων, αλλά για το ADO είναι διπλή περισσότερες διασυνδέσεις και δεν υλοποιηθεί ως coclass ή διασύνδεση.

Έξυπνες δηλώσεις TypeDef δείκτη

Για διασυνδέσεις και οι δύο διασυνδέσεις, έξυπνες δείκτες κηρύσσονται, όπου απλοποιεί σημαντικά τη χρήση του περιβάλλοντος εργασίας:
   ...
   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
   ...
   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));
   ...
				
Σημειώστε ότι δεν υπάρχει δείκτης έξυπνης έχουν δηλωθεί για την κλάση σύνδεσης διασύνδεση.

Στοιχεία βιβλιοθήκης τύπου

Σε αυτές περιλαμβάνονται τυχόν με απαρίθμηση τύπους που ορίζονται στο στοιχείο typelib, καθώς και εφαρμογή των έξυπνων δείκτες και στοιχεία βιβλιοθήκης τύπων:

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 και put μεθόδους για ConnectionString. Οι μέθοδοι Wrapper η ενότητα παρέχει μεθόδους δημιουργήθηκε από # 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 αφού το αντικείμενο στην πραγματικότητα την κυκλοφορία, σε αντίθεση με απλώς ποσοστό μείωσης της αναφοράς υπολογίζονται χωρίς στην πραγματικότητα, καταστροφή του αντικειμένου. Με ρητή κλήση απελευθέρωση χωρίς ()-- πολύ ρητή κλήση AddRef() για να εξισορροπήσετε το--# Import gladly θα προσπαθήσει να Αφήστε ένα αντικείμενο που δεν υπάρχει, δημιουργώντας επιπτώσεις ενδιαφέροντα και κατάρρευσης συμπεριφορά.

Καλύτερες συμβουλές, κάνατε δεν AddRef() της (ή τουλάχιστον χωρίς να απαιτείται), αφήστε είτε σε αυτό.

Αναφορές

  • ΤΙΤΛΟΣ ΑΡΘΡΟΥ ΕΣΩΤΕΡΙΚΗΣ Com από Dale Rogerson ISBN 1-57231-349-8
  • Το OLE-COM αντικείμενο προβολής (Oleview.exe) που παραδίδεται με Visual C++ για εξετάζοντας τα περιεχόμενα της βιβλιοθήκης τύπων.
  • Visual C++ ηλεκτρονική τεκμηρίωση: αναζήτηση σε # Import
Για πρόσθετες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:
182389ΑΡΧΕΊΟ: Adovcbm.exe ADO 1.5 με # Import και Getrows/σελιδοδείκτες
184968ΑΡΧΕΊΟ: Adovcsp.exe παρουσιάζει τη χρήση αποθηκευμένων διαδικασιών με το ADO
186387ΔΕΊΓΜΑΤΑ: Ado2atl.exe επιστρέφει ADO διασυνδέσεις από το COM
181733ΑΡΧΕΊΟ: # Import Adovcbtd.exe χρήση UpdateBatch και CancelBatch
166112PRB: Διένεξη με το EOF κατά τη χρήση # Import με το ADO
168354ΠΛΗΡΟΦΟΡΙΕΣ: Υποκείμενο OLE και σφάλματα της υπηρεσίας παροχής OLEDB εκτίθενται μέσω των ADO

Ιδιότητες

Αναγν. άρθρου: 169496 - Τελευταία αναθεώρηση: Πέμπτη, 27 Ιανουαρίου 2011 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Data Access Components 2.7
Λέξεις-κλειδιά: 
kbcode kbdatabase kbinfo kbusage kbmt KB169496 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:169496

Αποστολή σχολίων

 

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