Share via


동적 접근자 사용

동적 접근자를 사용하면 데이터베이스 스키마(기본 구조)에 대한 지식이 없는 경우 데이터 원본에 액세스할 수 있습니다. OLE DB 템플릿 라이브러리는 도움이 되는 몇 가지 클래스를 제공합니다.

DynamicConsumer 샘플에서는 동적 접근자 클래스를 사용하여 열 정보를 얻고 접근자를 동적으로 만드는 방법을 보여 줍니다.

CDynamicAccessor 사용

CDynamicAccessor 를 사용하면 데이터베이스 스키마(데이터베이스의 기본 구조)에 대한 지식이 없는 경우 데이터 원본에 액세스할 수 있습니다. CDynamicAccessor 메서드는 열 이름, 개수 및 데이터 형식과 같은 열 정보를 가져옵니다. 이 열 정보를 사용하여 런타임에 동적으로 접근자를 만듭니다. 열 정보는 이 클래스에서 만들고 관리하는 버퍼에 저장됩니다. GetValue 메서드를 사용하여 버퍼에서 데이터를 가져옵니다.

예: CDynamic 접근자

// Using_Dynamic_Accessors.cpp
// compile with: /c /EHsc
#include <stdio.h>
#include <objbase.h>
#include <atldbcli.h>

int main(int argc, char* argv[] )
{
    HRESULT hr = CoInitialize(NULL );

    CDataSource ds;
    CSession ss;

    CTable<CDynamicAccessor> rs;

    // The following is an example initialization string:
    hr = ds.OpenFromInitializationString(L"Provider=SQLOLEDB.1;"
      L"Integrated Security=SSPI;Persist Security Info=False;"
      L"Initial Catalog=Loginname;Data Source=your_data_source;"
      L"Use Procedure for Prepare=1;Auto Translate=True;"
      L"Packet Size=4096;Workstation ID=LOGINNAME01;"
      L"Use Encryption for Data=False;"
      L"Tag with column collation when possible=False");

    hr = ss.Open(ds );
    hr = rs.Open(ss, "Shippers" );

    hr = rs.MoveFirst();
    while(SUCCEEDED(hr ) && hr != DB_S_ENDOFROWSET )
    {
        for(size_t i = 1; i <= rs.GetColumnCount(); i++ )
        {
            DBTYPE type;
            rs.GetColumnType(i, &type );
            printf_s( "Column %d [%S] is of type %d\n",
                      i, rs.GetColumnName(i ), type );

            switch(type )
            {
                case DBTYPE_WSTR:
                    printf_s( "value is %S\n",
                              (WCHAR*)rs.GetValue(i ) );
                break;
                case DBTYPE_STR:
                    printf_s( "value is %s\n",
                              (CHAR*)rs.GetValue(i ) );
                default:
                    printf_s( "value is %d\n",
                              *(long*)rs.GetValue(i ) );
            }
        }
        hr = rs.MoveNext();
    }

    rs.Close();
    ss.Close();
    ds.Close();
    CoUninitialize();

    return 0;
}

CDynamicStringAccessor 사용

CDynamicStringAccessor는 한 가지 중요한 방법을 제외하고 CDynamicAccessor처럼 작동합니다. 공급자가 보고한 네이티브 형식으로 데이터를 요청하는 동안 CDynamicAccessor 공급자 CDynamicStringAccessor 가 데이터 저장소에서 액세스한 모든 데이터를 문자열 데이터로 가져오라고 요청합니다. 이 프로세스는 데이터 저장소의 내용 표시 또는 인쇄와 같이 데이터 저장소의 값 계산이 필요하지 않은 간단한 작업에 특히 유용합니다.

메서드를 사용하여 CDynamicStringAccessor 열 정보를 가져옵니다. 이 열 정보를 사용하여 런타임에 동적으로 접근자를 만듭니다. 열 정보는 이 클래스에서 만들고 관리하는 버퍼에 저장됩니다. CDynamicStringAccessor::GetString을 사용하여 버퍼에서 데이터를 가져와서 CDynamicStringAccessor::SetString을 사용하여 버퍼에 저장합니다.

예: CDynamicStringAccessor

// Using_Dynamic_Accessors_b.cpp
// compile with: /c /EHsc
#include <stdio.h>
#include <objbase.h>
#include <atldbcli.h>

int main(int argc, char* argv[] )
{
    HRESULT hr = CoInitialize(NULL );
    if (hr != S_OK)
    {
        exit (-1);
    }

    CDataSource ds;
    CSession ss;

    CTable<CDynamicStringAccessor> rs;

    // The following is an example initialization string:
    hr = ds.OpenFromInitializationString(L"Provider=SQLOLEDB.1;"
      L"Integrated Security=SSPI;Persist Security Info=False;"
      L"Initial Catalog=Loginname;Data Source=your_data_source;"
      L"Use Procedure for Prepare=1;Auto Translate=True;"
      L"Packet Size=4096;Workstation ID=LOGINNAME01;"
      L"Use Encryption for Data=False;"
      L"Tag with column collation when possible=False");

    hr = ss.Open(ds );
    hr = rs.Open(ss, "Shippers" );

    hr = rs.MoveFirst();
    while(SUCCEEDED(hr ) && hr != DB_S_ENDOFROWSET )
    {
        for(size_t i = 1; i <= rs.GetColumnCount(); i++ )
        {
            printf_s( "column %d value is %s\n",
                      i, rs.GetString(i ) );
        }
        hr = rs.MoveNext();
    }

    rs.Close();
    ss.Close();
    ds.Close();
    CoUninitialize();

   return 0;
}

CDynamicParameterAccessor 사용

CDynamicParameterAccessor는 ICommandWithParameters 인터페이스를 호출하여 설정할 매개 변수 정보를 가져오는 것을 CDynamicParameterAccessor 제외하고 CDynamicAccessor와 유사합니다. 공급자는 이 클래스를 사용할 소비자에 대해 ICommandWithParameters 를 지원해야 합니다.

매개 변수 정보는 이 클래스로 만들고 관리하는 버퍼에 저장됩니다. CDynamicParameterAccessor::GetParam 및 CDynamicParameterAccessor::GetParamType을 사용하여 버퍼에서 매개 변수 데이터를 가져옵니다.

이 클래스를 사용하여 SQL Server 저장 프로시저를 실행하고 출력 매개 변수 값을 가져오는 방법을 보여 주는 예제는 GitHub의 Microsoft VCSamples 리포지토리에 있는 DynamicConsumer 샘플 코드를 참조하세요.

참고 항목

접근자 사용
CDynamicAccessor 클래스
CDynamicStringAccessor Class
CDynamicParameterAccessor 클래스
DynamicConsumer 샘플