ИНФОРМАЦИЯ: С помощью объектов данных ActiveX (ADO) через # import в VC ++

Переводы статьи Переводы статьи
Код статьи: 169496 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Директива # import в Visual C++ предлагает новый мощный механизм для Управление серверами OLE. При использовании с объектами данных ActiveX (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 ) );

   ...
				
Объявления и создать экземпляр до p, экземпляр структуры InitOle и, следовательно, инициализирует OLE в его конструктор. Без такого типа элемента резервный, появится следующее сообщение об ошибке:
Необработанное исключение в [программа] (KERNEL32.БИБЛИОТЕКА DLL): 0XE06D7363
Исключение C++ корпорации Майкрософт.

Правильности реализации директивы # import

Очень важно для правильного вызова ADO в программе, или с помощью ошибки компилятора. Следующий код демонстрирует правильный способ, с помощью директивы # import с Msado10.dll MSADO15.dll.

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

Обработка ошибок

С ADO может появиться сообщение об ошибке в значение HRESULT, возвращенное из метода ADO можно получить исключение, созданное # import созданных классов, а также может быть заполнен хотя бы одно условие коллекции ошибок ADO. Для получить в коллекции ошибок необходим объект соединения. Для получения дополнительных сведений обратитесь к следующей статье Microsoft Knowledge Base:

169498 ИНФОРМАЦИЯ: Извлечение сведений об ошибках из ADO в VC ++ с помощью директивы # import

ADO и Dbdaoint.h

Предпринимается попытка смешивать ADO (с помощью директивы # import) и MFC DAO или DAO SDK в одном файле реализации следующим образом:

  #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-файле может быть разбиваются следующим образом:
  • Прямые ссылки и определения типов
  • Определение типа смарт-указатель и объявления
  • Элементы библиотеки типов
Ниже подробно описан каждый.

Прямые ссылки и определения типов

Прямые ссылки и определения типов создаются посредством использования элемента структуры __declspec(UUID("...")) на идентификатор GUID для любого сдвоенный интерфейс, интерфейс, и Компонентный класс, определенный в библиотеки типов.

   ...
   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));
   ...
				
Обратите внимание, что смарт-указатель, не был объявлен для совместного подключения интерфейс.

Элементы библиотеки типов

Это включает перечислимые типы, определенные в библиотеки типов, а также Реализация смарт-указатели и элементы библиотеки типов:

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. Методы создания оболочки раздел содержит методы созданных # 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() баланс it--# import попытается gladly освободить объект, который не существует, создание интересных побочные эффекты и аварийное завершение работы поведение.

Лучшие советы, как не AddRef() его (или хотя бы не требуется), не освобождают его либо.

Ссылки

  • Внутри Com, Dale Rogerson ISBN 1-57231-349-8
  • -Просмотра объектов OLE COM (Oleview.exe), поставляемый в комплекте с Visual C++ для исследования содержимого библиотеки типов.
  • Электронной документации по Visual C++: поиск на # import
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
182389 ФАЙЛА: Adovcbm.exe ADO 1.5 с помощью директивы # import и Getrows/закладки
184968 ФАЙЛ: Adovcsp.exe демонстрирует использование хранимых процедур с помощью ADO
186387 Пример: Ado2atl.exe возвращает интерфейсы ADO из COM
181733 ФАЙЛА: Adovcbtd.exe # import с помощью UpdateBatch и CancelBatch
166112 PRB: Конфликт с EOF при использовании директивы # import с ADO
168354 ИНФОРМАЦИЯ: Базовый OLE и ошибок поставщика OLEDB предоставляются через ADO

Свойства

Код статьи: 169496 - Последний отзыв: 3 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Data Access Components 2.7
Ключевые слова: 
kbcode kbdatabase kbinfo kbusage kbmt KB169496 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: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