정보: VC ++ # import 통해 ADO (ActiveX 데이터 개체) 사용

기술 자료 번역 기술 자료 번역
기술 자료: 169496 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

Visual C++ 에서 # import 지시문을 OLE 서버를 조작하기 위한 강력한 새 메커니즘을 제공합니다. ADO (ActiveX 데이터 개체)를 사용할 때 # import에 데이터를 가져오는 단순화할 수 있습니다. 이 문서에서는 ADO 사용하여 # import 활용하는 데 필요한 무엇입니까 설명합니다.

추가 정보

귀하가 인스턴스화 모든 클래스 만든 전에 # import에 의해

# import에 의해 만들어진 클래스의 모든 인스턴스를 만들기 전에 OLE를 초기화할 수 중요합니다. 이를 # 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, ADO 메서드에서 반환된 HRESULT 오류가 나타날 수 있습니다, # import 생성된 클래스에 의해 발생한 예외가 발생할 수 있습니다 및 ADO 오류 수집 조건이 하나라도 채울 수 있습니다. 시 오류 컬렉션 얻기 위해 유효한 연결 개체가 필요합니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.

169498압축 정보: 오류 정보 VC ++ ADO에서 함께 # import 풀기

ADO 및 Dbdaoint.h

# import) 통해 ADO 및 MFC DAO 또는 같은 구현 파일에 있는 DAO SDK 같이 혼합할 시도합니다.

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

  #import <msado15.dll> no_namespace ...
				

다음과 같은 6개의 오류가 발생하는 경우를 보여 줍니다.

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/dbdao.h> 포함됩니다.
  • ADO에 대해 생성된 모든 네임스페이스를 만들 # import 문을 수정하십시오. 즉, 두 함수는 아래 표시된 것처럼 ADO 개체를 참조할 때 네임스페이스를 참조할 수 있습니다. 첫 번째 함수 내에 단독으로 ADO를 사용하는 방법을 보여 줍니다. 두 번째 보여 조합 및 일치하는 DAO 및 ADO 개체 방법. 경우에만 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 모든 이중 인터페이스, 인터페이스, 만들고 있는 형식 라이브러리를 CoClass 정의된.

   ...
   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));
   ...
				
참고 coclass 연결 인터페이스에 대한 스마트 포인터가 선언되었습니다.

형식 라이브러리 항목

스마트 포인터 및 형식 라이브러리 항목을 잘 구현으로 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;
      ...
   };
				
앞의 코드 조각 속성 데이터 영역의 get 선언하고 메서드에 대한 ConnectionString 넣을 declspec를 사용합니다. 래퍼 메서드가 섹션을 # 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"" );
				


ODBC 데이터 원본에 pubs 위치입니다.

# import 및 Release() 명시적으로 호출

# import 장점은 이를 걸리는 AddRef, QueryInterface, 및 릴리스 자동으로 관리합니다 있다는 것입니다. 그러나 Release() 명시적으로 호출하면 시작할 경우 문제를 직접 만들 수 있습니다.

멤버 변수, m_pInterface _com_ptr_t 내에 있습니다. # import 매우 가는 래퍼 마찬가지로 개체가 실제로, 단지 감소시키는 개체를 손상시키지 않고 해당 참조 횟수를 대 출시된 후 m_pInterface 함께 없음 구분이 있습니다. 릴리스 명시적으로 호출하여 이를--# import 균형을 매우 명시적으로 호출 AddRef() 않고--연구() gladly 흥미로운 부작용이 및 충돌 동작을 만드는 존재하지 않는 개체를 해제하는 시도합니다.

최상의 조언 없는 AddRef() 이를 또는 적어도 필요가 사용한, 하나를 해제하지 않습니다.

참조

  • Dale Rogerson 1-57231-349-8 ISBN에 의해 안쪽 Com
  • OLE COM 개체 제공되는 뷰어 (Oleview.exe) 형식 라이브러리를 내용을 검사할 Visual C++.
  • Visual C++ 온라인 설명서: # import 검색
자세한 내용은 Microsoft 기술 자료 문서를 보려면 해당 자료의 문서를 참조하십시오.
182389# import 함께 1.5 ADO 및 Getrows/책갈피 FILE: Adovcbm.exe
184968Adovcsp.exe 사용하여 FILE: 설명 저장 프로시저 ADO 사용하여
186387예제: COM에서 ADO 인터페이스 Ado2atl.exe가 반환합니다.
181733FILE: Adovcbtd.exe # import 사용 UpdateBatch 및 CancelBatch
166112# import ADO 함께 사용하면 EOF 함께 PRB: 충돌
168354정보: 기본 OLE 및 OLEDB 공급자 오류 ADO를 통해 노출된?

속성

기술 자료: 169496 - 마지막 검토: 2005년 3월 2일 수요일 - 수정: 3.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft ActiveX Data Objects 1.0?을(를) 다음과 함께 사용했을 때
    • 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?을(를) 다음과 함께 사용했을 때
    • 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?을(를) 다음과 함께 사용했을 때
    • 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?을(를) 다음과 함께 사용했을 때
    • 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?을(를) 다음과 함께 사용했을 때
    • 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?을(를) 다음과 함께 사용했을 때
    • 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
키워드:?
kbmt kbcode kbdatabase kbinfo kbusage KB169496 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

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