Passing OLE DB Conformance Tests
To make providers more consistent, the Data Access SDK provides a set of OLE DB conformance tests. The tests check all aspects of your provider and give you reasonable assurance that your provider functions as expected. You can find the OLE DB conformance tests on the Microsoft Data Access SDK. This section focuses on things you should do to pass the conformance tests. For information about running the OLE DB conformance tests, see the SDK.
Running the Conformance Tests
In Visual C++ 6.0, the OLE DB provider templates added a number of hooking functions to allow you to check values and properties. Most of these functions were added in response to the conformance tests.
Note
You need to add several validation functions for your provider to pass the OLE DB conformance tests.
This provider requires two validation routines. The first routine, CRowsetImpl::ValidateCommandID
, is part of your rowset class. It's called during the creation of the rowset by the provider templates. The sample uses this routine to tell consumers that it doesn't support indexes. The first call is to CRowsetImpl::ValidateCommandID
(note that the provider uses the _RowsetBaseClass
typedef added in the interface map for CCustomRowset
in Provider Support for Bookmarks, so you don't have to type that long line of template arguments). Next, return DB_E_NOINDEX if the index parameter isn't NULL (this indicates the consumer wants to use an index on us). For more information about command IDs, see the OLE DB specification and look for IOpenRowset::OpenRowset
.
The following code is the ValidateCommandID
validation routine:
/////////////////////////////////////////////////////////////////////
// CustomRS.H
// Class: CCustomRowset
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;
}
The provider templates call the OnPropertyChanged
method whenever someone changes a property on the DBPROPSET_ROWSET group. If you want to handle properties for other groups, you add them to the appropriate object (that is, DBPROPSET_SESSION checks go in the CCustomSession
class).
The code first checks to see whether the property is linked to another. If the property is being chained, it sets the DBPROP_BOOKMARKS property to True
. Appendix C of the OLE DB specification contains information about properties. This information also tells you whether the property is chained to another one.
You might also want to add the IsValidValue
routine to your code. The templates call IsValidValue
when trying to set a property. You would override this method if you require additional processing when setting a property value. You can have one of these methods for each property set.