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』 類別。 每個類別都會提供介面的實作。 數據源物件會實作IPersist
、 IDBProperties
IDBInitialize
、 和 IDBCreateSession
介面。 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,並告知 中的 CComObjectRootEx
實QueryInterface
作傳回適當的介面。
屬性對應
屬性對應會指定提供者指派的所有屬性:
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 和識別碼。 它也包含專案,以判斷 屬性的類型和值。
如果您想要變更屬性的預設值(請注意,取用者可以隨時變更可寫入屬性的值),您可以使用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
之前),您可以使用 UPROPSET_USERINIT 旗標以及BEGIN_PROPERTY_SET_EX 巨集來指定這個值。 屬性集必須位於數據源物件中,才能運作(如 OLE DB 規格需要)。 例如:
BEGIN_PROPERTY_SET_EX(DBPROPSET_MYPROPSET, UPROPSET_USERINIT)
PROPERTY_INFO_ENTRY(DBPROP_MYPROP)
END_PROPERTY_SET_EX(DBPROPSET_MYPROPSET)