共用方式為


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 元件都衍生自 CComObjectRootExCComCoClassCComObjectRootEx 提供介面的所有實作 IUnknown 。 它可以處理任何線程模型。 CComCoClass 處理所需的任何錯誤支援。 如果您想要將更豐富的錯誤資訊傳送至用戶端,您可以使用 中的 CComCoClass一些錯誤 API。

數據源物件也會繼承自數個 『Impl』 類別。 每個類別都會提供介面的實作。 數據源物件會實作IPersistIDBPropertiesIDBInitialize、 和 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,並告知 中的 CComObjectRootExQueryInterface作傳回適當的介面。

屬性對應

屬性對應會指定提供者指派的所有屬性:

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++支援使用者定義的屬性集。 您不需要覆寫 GetPropertiesGetPropertyInfo。 相反地,範本會偵測任何使用者定義的屬性集,並將其新增至適當的物件。

如果您的使用者定義屬性集必須在初始化期間使用(也就是取用者呼叫 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)

另請參閱

提供者精靈產生的檔案