다음을 통해 공유


AdvancedPV 샘플: 고급 공급자 기술

업데이트: 2007년 11월

AdvancedPV 샘플은 UpdatePV와 매우 유사하지만 몇 가지 고급 기술을 보여 줍니다.

일반적으로 OLE DB 템플릿을 사용하여 작성된 공급자는 데이터 저장소에 CAtlArray를 사용합니다. OLE DB 공급자 템플릿에서는 사용자 제공 Execute 메서드를 호출하여 배열을 채웁니다. 예를 들어, 데이터 파일의 모든 행을 배열에 로드합니다. 또 다른 사용자 제공 메서드인 FlushData는 배열의 내용을 저장하는 데 사용됩니다. 예를 들면, 배열 내용을 다시 데이터 파일에 씁니다. 이 방법을 사용할 때의 문제는 Execute에서 행 집합에 있는 모든 행을 로드해야 하고 FlushData에서는 모든 행을 동시에 저장해야 한다는 점입니다. 행 집합에 많은 행이 있으면 모든 데이터가 메모리(CAtlArray 개체)에 저장되어야 합니다.

AdvancedPV에서는 기본 CAtlArray 배열 대신 특별한 배열 클래스를 사용하여 공급자가 필요에 따라 행을 로드하고 저장할 수 있도록 합니다. 행은 특별히 구현된 operator[]를 통해 실제로 요청될 때만 데이터 파일에서 로드되고, 변경 내용은 배열 내용이 변경되는 즉시 파일에 다시 쓰여집니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

이 샘플을 빌드하고 실행하려면

  1. 솔루션 파일인 AdvancedPV.sln을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. Win32 프로젝트 마법사를 사용하여 Win32 콘솔 응용 프로그램을 만듭니다. 만든 응용 프로그램에 ATL 지원 기능을 부여합니다.

  4. 클래스 추가에서 ATL OLE DB 소비자를 선택하여 프로젝트에 OLE DB 소비자를 추가합니다.

  5. ATL OLE DB 소비자 마법사에서 데이터 소스 단추를 클릭하고 데이터 연결 속성에서 AdvancedProv Provider를 선택합니다. AdvancedProv 공급자는 AdvancedPV를 빌드할 때 자동으로 등록되어야 하지만 목록에 이 공급자가 없는 경우에는 AdvancedPV.dll에 대해 regsvr32.exe를 실행합니다.

  6. Next를 클릭하여 연결 탭으로 이동한 다음 **사용할 초기 카탈로그를 입력하십시오.**에서 사용할 초기 카탈로그(DataFile.dat 경로)를 지정합니다.

  7. 데이터베이스 개체 선택에서 테이블을 엽니다. 여기에는 하나의 항목(DataFile.dat 경로)만 있습니다. 해당 항목을 선택하고 확인을 클릭합니다. ATL OLE DB 소비자 마법사로 돌아가서 테이블을 선택하고 필요하면 클래스 이름을 CMyCons 등의 더 짧은 이름으로 바꾼 다음 마침을 클릭합니다. 소비자 프로젝트를 빌드합니다.

  8. 프로젝트의 주 코드에 다음을 추가합니다.

    #include "MyCons.h" 
     
    int main( int argc, char* argv[] )
    {
       // Add this code
       HRESULT hr = CoInitialize(NULL);   CMyCons rs;   hr = rs.OpenAll();   ATLASSERT( SUCCEEDED(hr));   hr = rs.MoveFirst();   while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET )   {      printf( "%d %s %s %s %s\n", rs.m_Fixed, rs.m_Command, rs.m_Text,       rs.m_Command2, rs.m_Text2 );      hr = rs.MoveNext();   }   rs.CloseAll();   CoUninitialize();   return 0;
    }
    
  9. CoUninitialize 함수에 중단점을 설정합니다. 이렇게 하면 콘솔이 열린 상태로 있으므로 결과를 볼 수 있습니다. 시작 단추를 클릭하거나 디버그 메뉴에서 디버깅하지 않고 시작을 클릭하여 응용 프로그램을 실행합니다. 다섯 개의 텍스트 열이 출력되어야 합니다. 이 중 하나는 인덱스이고 네 개는 텍스트 열입니다.

키워드

이 샘플에서는 다음의 인터페이스를 사용합니다.

IRowsetLocateImpl, IRowsetScroll, IRowsetScrollImpl, IRowsetUpdateImpl, IConnectionPointContainerImpl, IRowsetNotifyCP, IDBCreateSessionImpl, IDBInitializeImpl, IDBPropertiesImpl, IPersistImpl, IInternalConnectionImpl, IGetDataSourceImpl, IOpenRowsetImpl, ISessionPropertiesImpl, IObjectWithSiteSessionImpl, IDBSchemaRowsetImpl, IDBCreateCommandImpl, IAccessorImpl, ICommandTextImpl, ICommandPropertiesImpl, IObjectWithSiteImpl, IConvertTypeImpl, IColumnsInfoImpl, IInternalCommandConnectionImpl

이 샘플에서는 다음의 클래스를 보여 줍니다.

CSchemaRowsetImpl, CComObjectRootEx, CComObjectRootEx, CRowsetImpl, CFileArray, CSimpleRow

이 샘플에서는 다음의 매크로를 보여 줍니다.

COM_INTERFACE_ENTRY, PROPERTY_INFO_ENTRY

참고 항목

기타 리소스

ATL 샘플