BILGI: VC ++ alma ile ActiveX Data Objects (ADO) kullanarak.

Makale çevirileri Makale çevirileri
Makale numarası: 169496 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Visual C++ alma yönergesinde OLE sunucuları yönetmek için güçlü yeni mekanizması sunar. ActiveX Data Objects (ADO) kullandığınızda, alma, veri alma basitleştirebilir. Bu makalede, ADO ile alma yararlanmak için gereken nedir anlatılır.

Daha fazla bilgi

Önce tüm sınıflar oluşturma tarafından alma başlatılamadı

Herhangi bir alma işlemi tarafından oluşturulan bir sınıfların örneklerini oluşturmadan önce OLE başlatılamıyor önemlidir. Bu alma akıllı bir işaretçi bildirir, OLE başlatır ve sonra Akıllı işaretçiyi başlatır, aşağıdaki kod, güvenlidir:

   // Declare smart pointer of Recordset
    _RecordsetPtr     p;

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

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

      ...
   }
				
Sonraki kod örneği, ancak güvenli olmayan ve işlenmeyen bir özel durum oluşturur. Genel Akıllı işaretçiyi p hem bildirilen ve (belirli bir uuid oluşturucu içinde geçirmeden sayesinde) örneği:

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

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

      ...
   }
				
P genel değişken olduğundan, Coınitialize her zamankinden main() çağrılmadan önce örneği. Bunu aşağıdaki kod parçacığının ile düzeltebilirsiniz:
struct InitOle {
      InitOle()  { ::CoInitialize(NULL); }
      ~InitOle() { ::CoUninitialize();   }
    } _init_InitOle_;

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

   ...
				
Yapı InitOle örneğini bildirildi, önce p örneği ve, bu nedenle, kendi kurucusunda OLE'ni başlatır. Bu tür başarısızlık durumunda güvenli, aşağıdaki hata iletisini görürsünüz:
[/ Program] (KERNEL32.DLL) özel durumu işlenmeyen: 0xE06D7363
Microsoft C++ özel durumu.

Alma, doğru uygulama

ADO programın doğru olarak çağırmak önemlidir; derleyici hataları olabilir. Aşağıdaki kodda, alma Msado10.dll the MSADO15.dll</a0> ile kullanmak üzere doğru şekilde gösterilmiştir:

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

Hata işleme

ADO, bir ADO yönteminden döndürülen HRESULT içinde bir hata iletisi, oluşturulan alma sınıfları tarafından geçirilen bir özel durumla ve her iki koşul için ADO Errors'koleksiyonu doldurulan. Errors derlemesi sırasında için geçerli bir bağlantı nesnesi gerekir. Daha fazla bilgi için, lütfen aşağıdaki Microsoft Knowledge Base makalesine bakın:

169498BILGI: Hata bilgisi alma ile gelen ADO VC ++ ayıklanıyor

ADO ve Dbdaoint.h

ADO ile (alma) ve MFC DAO veya aynı uygulama dosyası, DAO SDK'DA karıştırmak, aşağıdaki gibi çalışır:

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

  #import <msado15.dll> no_namespace ...
				

Aşağıdaki altı hataları oluşturur:

<a1>hata</a1> C2011: 'EditModeEnum': 'enum' redefinition yazın...
<a1>hata</a1> C2011: 'LockTypeEnum': 'enum' redefinition yazın...
<a1>hata</a1> C2011: 'FieldAttributeEnum': 'enum' redefinition yazın...
<a1>hata</a1> C2011: 'DataTypeEnum': 'enum' redefinition yazın...
<a1>hata</a1> C2011: 'ParameterDirectionEnum': 'enum' redefinition yazın...
<a1>hata</a1> C2011: 'RecordStatusEnum': 'enum' redefinition yazın...
Çok neredeyse aynı içeriğe karşın, ADO tarafından gerekli olan ve DAO tarafından gerekli olan fiili değerleri her bir Enum türü farklı. Bu sorunu gidermek için birkaç seçeneğiniz vardır:

  • Ayrı .cpp dosyaları içine ayrı ADO ve DAO kodu. Alma kullanımını korumak veya # <afxdao.h/dbdao.h> de ayrı bir uygulama dosyalarını içerir.
  • ADO için oluşturulan herhangi bir şey için bir ad alanı oluşturmak için alma deyimi değiştirin. Bu ad, aşağıdaki iki işlev gösterildiği gibi bir ADO nesnesi başvururken başvuru gerekecek anlamına gelir. Ilk ADO yalnızca işlev içinde nasıl kullanıldığını gösterir. Ikinci gösterir karışık ve eşleşme ADO ve DAO nesneleri için. Bu yalnızca açıkça herhangi bir ADO sınıfı veya numaralandırılmış türü için ADO ad başvurarak yapılabilir:

       #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 ve kullanma

alma Msado105.tlh ve Msado15.tli Msado15.dll içinde bulunan typelib'ın iki dosya oluşturur. .Tlh dosyasının yapısını gibi ayrılmış:
  • Başvurular ve Typedefs iletme
  • Akıllı işaretçi TypeDef ve bildirimleri
  • Tür kitaplığı öğeler
Her aşağıdaki ayrıntılı olarak açıklanmıştır.

Başvurular ve Typedefs iletme

Ileri başvurular ve Typedefs, GUID, yapı __declspec(uuid("...")) herhangi iki arabirimi için arabirim oluşturulur ve CoClass tür tanımlanmış.

   ...
   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))
   /* dual interface */ _Connection;
   ...
   struct __declspec(uuid("00000275-0000-0010-8000-00aa006d2ea4"))
   /* interface */ ICADOConnection;
   ...
   struct /* coclass */ Connection;
   ...
				
Tüm arabirimler, bağlantı gibi birden çok uygulamaları gerekir. Bu typelib bağlıdır, ancak için ADO arabirimlerinin çoğu arabirimi ya da coclass çift ve uygulanmıyor.

Akıllı işaretçi TypeDef bildirimleri

Arabirimleri ve çift arabirimleri için akıllı işaretçileri, hangi büyük ölçüde arabirimini kullanarak basitleştirir bildirilir:
   ...
   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
   ...
   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));
   ...
				
coclass bağlantısı arabirimi için yok Akıllı işaretçi bildirilen unutmayın.

Tür kitaplığı öğeler

Bu tür kitaplığı ', akıllı işaretçiler ve typelib öğeleri iyi uygulaması tanımlanan tüm numaralandırılmış türlerini içerir:

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;
      ...
   };
				
Önceki kod parçasını, özellik veri bölümünde get bildirmek ve yöntemleri için ConnectionString koymak için declspec kullanır. Wrapper yöntemleri bölüm, bu yöntemler kaydırmak ve başarılı değilse, özel durum _com_error yükseltmenizi alma tarafından oluşturulan yöntemleri sağlar. RAW yöntemleri bölümü arabirimi tarafından çağrılan gerçek yöntemi bildirir.

Call GetConnectionString veya PutConnectionString, ancak gerçekten gereksizdir. ConnectionString özelliği olduğundan, aşağıdaki başvuru:

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


Gerçek uygulaması GetConnectionString/PutConnectionString Msado15.tli dosyasında bulunabilir.

Kodunuzda bağlantı nesnesi kullanma zamanı geldiğinde, Msado15.tlh aşağıda tanımlanan ikili arabirim için akıllı işaretçiyi örneği'ni kullanabilirsiniz:

   _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 olduğu bir ODBC veri kaynağı.

alma ve Release() tam olarak arama

Alma avantajı, götüren AddRef Queryınterface ve Release sizin için otomatik olarak düşünmeniz emin olur. Release() açıkça çağrılıyor başlatmaya karar verirseniz, ancak kendiniz sorunları için oluşturabilirsiniz.

_Com_ptr_t içinde bir üye değişkeni, m_pInterface ' dir. Çok küçük bir sarmalayıcı alma olduğu gibi nesne gerçekten, başvuru sayma nesne zarar vermeden, yalnızca azaltma karşı yayımlandıktan sonra hiçbir ayırım m_pInterface ile kolaylaştırır. Release açıkça çağrılarak ()--BT--alma dengelemek üzere çok açıkça arama AddRef() olmadan gladly, ilginç yan etkileri ve crashing davranışı yok nesneyi yayımlamayı dener.

En iyi bir öneri yok AddRef() (veya en az gereksinim için) yaptığınız, ya da serbest değil.

Referanslar

  • Iç COM tarafından Dale Rogerson ISBN 1-57231-349-8
  • OLE COM nesnesi birlikte gelen Görüntüleyici (Oleview.exe) bir tür kitaplığı içeriğini incelemek için Visual C++ ile.
  • Visual C++ çevrimiçi belgelere: alma, arama
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
182389Dosya: Adovcbm.exe <a1>ADO</a1> 1.5 alma ile ve getrows/yer imleri
184968Kullanılmasını, FILE: Adovcsp.exe gösterir yordamlar ADO ile saklı
186387Örnek: ADO arabirimleri COM Ado2atl.exe döndürüyor
181733Dosya: Adovcbtd.exe alma kullanma UpdateBatch ve CancelBatch
166112SORUN: Alma, ADO ile kullanırken EOF çakışma
168354: BILGI ADO alt OLE ve OLEDB Sağlayıcısı hatası açığa

Özellikler

Makale numarası: 169496 - Last Review: 2 Mart 2005 Çarşamba - Gözden geçirme: 3.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft ActiveX Data Objects 1.0, Ne zaman ne ile kullanilir:
    • 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, Ne zaman ne ile kullanilir:
    • 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, Ne zaman ne ile kullanilir:
    • 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, Ne zaman ne ile kullanilir:
    • 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, Ne zaman ne ile kullanilir:
    • 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, Ne zaman ne ile kullanilir:
    • 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
Anahtar Kelimeler: 
kbmt kbcode kbdatabase kbinfo kbusage KB169496 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:169496

Geri Bildirim Ver

 

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