Αυτήν τη στιγμή είστε εκτός σύνδεσης, σε αναμονή για επανασύνδεση στο Internet

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

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: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
s_mfc

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί αυτόματα

Ιδιότητες

Αναγνωριστικό άρθρου: 169496 - Τελευταία αναθεώρηση: 12/04/2015 17:09:31 - Αναθεώρηση: 2.0

Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbcode kbdatabase kbinfo kbusage kbmt KB169496 KbMtel
Σχόλια