CCustomSource(CustomDS.h)
공급자 클래스는 여러 상속을 사용합니다. 다음 코드는 데이터 원본 개체에 대한 상속 체인을 보여 줍니다.
/////////////////////////////////////////////////////////////////////////
// CCustomSource
class ATL_NO_VTABLE CCustomSource :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCustomSource, &CLSID_Custom>,
public IDBCreateSessionImpl<CCustomSource, CCustomSession>,
public IDBInitializeImpl<CCustomSource>,
public IDBPropertiesImpl<CCustomSource>,
public IPersistImpl<CCustomSource>,
public IInternalConnectionImpl<CCustomSource>
모든 COM 구성 요소는 파생 CComObjectRootEx
됩니다 CComCoClass
. CComObjectRootEx
는 인터페이스에 대한 모든 구현을 IUnknown
제공합니다. 모든 스레딩 모델을 처리할 수 있습니다. CComCoClass
는 필요한 오류 지원을 처리합니다. 클라이언트에 더 풍부한 오류 정보를 보내려면 .에서 CComCoClass
오류 API 중 일부를 사용할 수 있습니다.
또한 데이터 원본 개체는 여러 'Impl' 클래스에서 상속됩니다. 각 클래스는 인터페이스에 대한 구현을 제공합니다. 데이터 원본 개체는 , IDBProperties
및 IDBInitialize
IDBCreateSession
인터페이스를 구현IPersist
합니다. 각 인터페이스는 OLE DB에서 데이터 원본 개체를 구현하는 데 필요합니다. 이러한 'Impl' 클래스 중 하나에서 상속하거나 상속하지 않고 특정 기능을 지원하거나 지원하지 않도록 선택할 수 있습니다. 인터페이스를 지원 IDBDataSourceAdmin
하려면 클래스에서 IDBDataSourceAdminImpl
상속하여 필요한 기능을 가져옵니다.
COM 맵
클라이언트가 데이터 원본에서 인터페이스를 호출 QueryInterface
할 때마다 다음 COM 맵을 통과합니다.
BEGIN_COM_MAP(CCustomSource)
COM_INTERFACE_ENTRY(IDBCreateSession)
COM_INTERFACE_ENTRY(IDBInitialize)
COM_INTERFACE_ENTRY(IDBProperties)
COM_INTERFACE_ENTRY(IPersist)
COM_INTERFACE_ENTRY(IInternalConnection)
END_COM_MAP()
COM_INTERFACE_ENTRY 매크로는 ATL에서 온 것이며 적절한 인터페이스를 반환하도록 구현 QueryInterface
CComObjectRootEx
에 지시합니다.
속성 맵
속성 맵은 공급자가 할당한 모든 속성을 지정합니다.
BEGIN_PROPSET_MAP(CCustomSource)
BEGIN_PROPERTY_SET(DBPROPSET_DATASOURCEINFO)
PROPERTY_INFO_ENTRY(ACTIVESESSIONS)
PROPERTY_INFO_ENTRY(ASYNCTXNABORT)
PROPERTY_INFO_ENTRY(ASYNCTXNCOMMIT)
PROPERTY_INFO_ENTRY(BYREFACCESSORS)
PROPERTY_INFO_ENTRY_VALUE(CATALOGLOCATION, DBPROPVAL_CL_START)
PROPERTY_INFO_ENTRY(CATALOGTERM)
PROPERTY_INFO_ENTRY(CATALOGUSAGE)
PROPERTY_INFO_ENTRY(COLUMNDEFINITION)
PROPERTY_INFO_ENTRY(CONCATNULLBEHAVIOR)
PROPERTY_INFO_ENTRY(DATASOURCENAME)
PROPERTY_INFO_ENTRY(DATASOURCEREADONLY)
PROPERTY_INFO_ENTRY(DBMSNAME)
PROPERTY_INFO_ENTRY(DBMSVER)
PROPERTY_INFO_ENTRY_VALUE(DSOTHREADMODEL, DBPROPVAL_RT_FREETHREAD)
PROPERTY_INFO_ENTRY(GROUPBY)
PROPERTY_INFO_ENTRY(HETEROGENEOUSTABLES)
PROPERTY_INFO_ENTRY(IDENTIFIERCASE)
PROPERTY_INFO_ENTRY(MAXINDEXSIZE)
PROPERTY_INFO_ENTRY(MAXROWSIZE)
PROPERTY_INFO_ENTRY(MAXROWSIZEINCLUDESBLOB)
PROPERTY_INFO_ENTRY(MAXTABLESINSELECT)
PROPERTY_INFO_ENTRY(MULTIPLEPARAMSETS)
PROPERTY_INFO_ENTRY(MULTIPLERESULTS)
PROPERTY_INFO_ENTRY(MULTIPLESTORAGEOBJECTS)
PROPERTY_INFO_ENTRY(MULTITABLEUPDATE)
PROPERTY_INFO_ENTRY(NULLCOLLATION)
PROPERTY_INFO_ENTRY(OLEOBJECTS)
PROPERTY_INFO_ENTRY(ORDERBYCOLUMNSINSELECT)
PROPERTY_INFO_ENTRY(OUTPUTPARAMETERAVAILABILITY)
PROPERTY_INFO_ENTRY(PERSISTENTIDTYPE)
PROPERTY_INFO_ENTRY(PREPAREABORTBEHAVIOR)
PROPERTY_INFO_ENTRY(PREPARECOMMITBEHAVIOR)
PROPERTY_INFO_ENTRY(PROCEDURETERM)
PROPERTY_INFO_ENTRY(PROVIDERNAME)
PROPERTY_INFO_ENTRY(PROVIDEROLEDBVER)
PROPERTY_INFO_ENTRY(PROVIDERVER)
PROPERTY_INFO_ENTRY(QUOTEDIDENTIFIERCASE)
PROPERTY_INFO_ENTRY(ROWSETCONVERSIONSONCOMMAND)
PROPERTY_INFO_ENTRY(SCHEMATERM)
PROPERTY_INFO_ENTRY(SCHEMAUSAGE)
PROPERTY_INFO_ENTRY(STRUCTUREDSTORAGE)
PROPERTY_INFO_ENTRY(SUBQUERIES)
PROPERTY_INFO_ENTRY(TABLETERM)
PROPERTY_INFO_ENTRY(USERNAME)
END_PROPERTY_SET(DBPROPSET_DATASOURCEINFO)
BEGIN_PROPERTY_SET(DBPROPSET_DBINIT)
PROPERTY_INFO_ENTRY(AUTH_PASSWORD)
PROPERTY_INFO_ENTRY(AUTH_PERSIST_SENSITIVE_AUTHINFO)
PROPERTY_INFO_ENTRY(AUTH_USERID)
PROPERTY_INFO_ENTRY(INIT_DATASOURCE)
PROPERTY_INFO_ENTRY(INIT_HWND)
PROPERTY_INFO_ENTRY(INIT_LCID)
PROPERTY_INFO_ENTRY(INIT_LOCATION)
PROPERTY_INFO_ENTRY(INIT_MODE)
PROPERTY_INFO_ENTRY(INIT_PROMPT)
PROPERTY_INFO_ENTRY(INIT_PROVIDERSTRING)
PROPERTY_INFO_ENTRY(INIT_TIMEOUT)
END_PROPERTY_SET(DBPROPSET_DBINIT)
BEGIN_PROPERTY_SET(DBPROPSET_DATASOURCE)
PROPERTY_INFO_ENTRY(CURRENTCATALOG)
END_PROPERTY_SET(DBPROPSET_DATASOURCE)
CHAIN_PROPERTY_SET(CCustomSession)
END_PROPSET_MAP()
OLE DB의 속성이 그룹화됩니다. 데이터 원본 개체에는 두 개의 속성 그룹이 있습니다. 하나는 DBPROPSET_DATASOURCEINFO 집합용이고 다른 하나는 DBPROPSET_DBINIT 집합에 대한 것입니다. DBPROPSET_DATASOURCEINFO 집합은 공급자 및 해당 데이터 원본에 대한 속성에 해당합니다. DBPROPSET_DBINIT 집합은 초기화 시 사용되는 속성에 해당합니다. OLE DB 공급자 템플릿은 PROPERTY_SET 매크로를 사용하여 이러한 집합을 처리합니다. 매크로는 속성 배열을 포함하는 블록을 만듭니다. 클라이언트가 인터페이스를 호출할 IDBProperties
때마다 공급자는 속성 맵을 사용합니다.
사양의 모든 속성을 구현할 필요는 없습니다. 그러나 필요한 속성을 지원해야 합니다. 자세한 내용은 수준 0 규칙 사양을 참조하세요. 속성을 지원하지 않으려면 지도에서 제거할 수 있습니다. 속성을 지원하려면 PROPERTY_INFO_ENTRY 매크로를 사용하여 맵에 추가합니다. 매크로는 다음 코드와 같이 구조체에 해당 UPROPINFO
합니다.
struct UPROPINFO
{
DBPROPID dwPropId;
ULONG ulIDS;
VARTYPE VarType;
DBPROPFLAGS dwFlags;
union
{
DWORD dwVal;
LPOLESTR szVal;
};
DBPROPOPTIONS dwOption;
};
구조체의 각 요소는 속성을 처리하는 정보를 나타냅니다. 속성의 DBPROPID
GUID 및 ID를 결정하는 데 포함됩니다. 속성의 형식과 값을 결정하는 항목도 포함됩니다.
속성의 기본값을 변경하려는 경우(소비자가 언제든지 쓰기 가능한 속성의 값을 변경할 수 있음) PROPERTY_INFO_ENTRY_VALUE 또는 PROPERTY_INFO_ENTRY_EX 매크로를 사용할 수 있습니다. 이러한 매크로를 사용하면 해당 속성의 값을 지정할 수 있습니다. PROPERTY_INFO_ENTRY_VALUE 매크로는 값을 변경할 수 있는 약식 표기법입니다. PROPERTY_INFO_ENTRY_VALUE 매크로는 PROPERTY_INFO_ENTRY_EX 매크로를 호출합니다. 이 매크로를 사용하면 구조의 모든 특성을 UPROPINFO
추가하거나 변경할 수 있습니다.
고유한 속성 집합을 정의하려는 경우 추가 BEGIN_PROPSET_MAP/END_PROPSET_MAP 조합을 만들어 추가할 수 있습니다. 속성 집합에 대한 GUID를 정의한 다음 사용자 고유의 속성을 정의합니다. 공급자별 속성이 있는 경우 기존 속성을 사용하는 대신 새 속성 집합에 추가합니다. 이렇게 하면 이후 버전의 OLE DB에서 문제가 발생하지 않습니다.
사용자 정의 속성 집합
Visual C++는 사용자 정의 속성 집합을 지원합니다. 재정 GetProperties
의하거나 GetPropertyInfo
재정의할 필요가 없습니다. 대신 템플릿은 사용자 정의 속성 집합을 검색하여 적절한 개체에 추가합니다.
초기화 시(즉, 소비자가 호출 IDBInitialize::Initialize
하기 전에) 사용할 수 있어야 하는 사용자 정의 속성 집합이 있는 경우 BEGIN_PROPERTY_SET_EX 매크로와 함께 UPROPSET_USERINIT 플래그를 사용하여 이를 지정할 수 있습니다. OLE DB 사양에 따라 이 속성 집합이 작동하려면 데이터 원본 개체에 있어야 합니다. 다음은 그 예입니다.
BEGIN_PROPERTY_SET_EX(DBPROPSET_MYPROPSET, UPROPSET_USERINIT)
PROPERTY_INFO_ENTRY(DBPROP_MYPROP)
END_PROPERTY_SET_EX(DBPROPSET_MYPROPSET)