通過 OLE DB 一致性測試
更新:2007 年 11 月
為了使提供者更為一致,Data Access SDK 提供了一組 OLE DB 一致性測試。這些測試會檢查提供者的各個層面,並給予提供者函式可如預期運作的合理保證。您可在 Microsoft Data Access SDK 上找到 OLE DB 的一致性測試。本章節內容的重點在於應執行步驟來通過一致性測試。如需執行 OLE DB 一致性測試的詳細資訊,請參閱 SDK。
執行一致性測試
在 Visual C++ 6.0 中,OLE DB 提供者樣板會加入許多攔截函式,以便檢查數值和屬性。大多數函式都是為了回應一致性測試而加入的。
注意事項: |
---|
您需要加入數個驗證函式,提供者才能通過 OLE DB 的一致性測試。 |
這個提供者需要兩個驗證常式。第一個常式 -- CRowsetImpl::ValidateCommandID,是資料列集類別的一部分。它會在建立資料列集過程中由提供者樣板呼叫。範例將使用這個常式來告知消費者它並不支援索引。第一個呼叫是 CRowsetImpl::ValidateCommandID (請注意,提供者將使用提供者書籤支援中為 CMyProviderRowset 加入至介面對應內的 _RowsetBaseClass typedef,因此您不需輸入這麼長的樣板引數程式碼列)。接著,如果索引參數不是 NULL,便會傳回 DB_E_NOINDEX (這代表消費者想要在這些資料上使用索引)。如需命令 ID 的詳細資訊,請檢閱 OLE DB 規格,並尋找 IOpenRowset::OpenRowset。
下列程式碼為 ValidateCommandID 驗證常式:
/////////////////////////////////////////////////////////////////////
// MyProviderRS.H
// Class: CMyProviderRowset
HRESULT ValidateCommandID(DBID* pTableID, DBID* pIndexID)
{
HRESULT hr = _RowsetBaseClass::ValidateCommandID(pTableID, pIndexID);
if (hr != S_OK)
return hr;
if (pIndexID != NULL)
return DB_E_NOINDEX; // Doesn't support indexes
return S_OK;
}
每當某人變更 DBPROPSET_ROWSET 群組上的屬性時,提供者樣板就會呼叫 OnPropertyChanged 方法。如果您想要處理其他群組的屬性,可將它們加入至適當物件 (也就是說,DBPROPSET_SESSION 檢查會放入 CMyProviderSession 類別內)。
程式碼會先檢查屬性是否連結至另一個屬性。如果屬性被鏈結,就會將 DBPROP_BOOKMARKS 屬性設成 True。OLE DB 規格的<附錄 C>包含了屬性的資訊。這個資訊也會告訴您該屬性是否鏈結至另一個屬性。
您可能也希望將 IsValidValue 常式加入至程式碼。在嘗試設定屬性時,樣板將呼叫 IsValidValue。如果需要其他處理,您可以在設定屬性值時覆寫這個方法。您可為每個屬性集使用其中一種方法。
執行緒問題
預設情況下,ATL OLE DB 提供者精靈中的 OLE DB 提供者精靈將產生提供者的程式碼,以便於 Apartment Model 內執行。如果您嘗試以一致性測試來執行此程式碼,一開始就會失敗。這是因為用來執行 OLE DB 一致性測試的工具 Ltm.exe 將預設成無限制執行緒 (Free Thread)。OLE DB 提供者精靈程式碼會考慮效能和簡易使用因素,將此預設成 Apartment Model。
若要修正這個問題,您可以變更 LTM 或變更提供者。
若要變更 LTM 執行於 Apartment 執行緒模式
在 LTM 主功能表內按一下 [工具],然後按一下 [選項]。
在 [一般] 標籤內,將執行緒模型從 [無限制執行緒] 變更為 [Apartment 執行緒]。
若要變更提供者執行於無限制執行緒模式中:
在提供者專案內,搜尋所有的 CComSingleThreadModel 執行個體,將其取代成 CComMultiThreadModel,它應該會位於您的資料來源、工作階段 (Session) 和資料列集標頭內。
在 .rgs 檔內,將執行緒模型從 [Apartment] 變更成 [Both]。
依照正確的程式設計規則來撰寫無限制的執行緒程式 (也就是鎖定於寫入時)。