CUtlProps Class

Implements properties for a variety of OLE DB property interfaces (for example, IDBProperties, IDBProperties, and IRowsetInfo).

Syntax

template < class T >
class ATL_NO_VTABLE CUtlProps : public CUtlPropsBase

Parameters

T
The class that contains the BEGIN_PROPSET_MAP.

Requirements

Header: atldb.h

Members

Methods

Name Description
GetPropValue Gets a property from a property set.
IsValidValue Used to validate a value before setting a property.
OnInterfaceRequested Handles requests for an optional interface when a consumer calls a method on an object creation interface.
OnPropertyChanged Called after setting a property to handle chained properties.
SetPropValue Sets a property in a property set.

Remarks

Most of this class is an implementation detail.

CUtlProps contains two members for setting properties internally: GetPropValue and SetPropValue.

For more information on the macros used in a property set map, see BEGIN_PROPSET_MAP and END_PROPSET_MAP.

CUtlProps::GetPropValue

Gets a property from a property set.

Syntax

OUT_OF_LINE HRESULT GetPropValue(const GUID* pguidPropSet,
   DBPROPID dwPropId,
   VARIANT* pvValue);

Parameters

pguidPropSet
[in] The GUID for the PropSet.

dwPropId
[in] The property index.

pvValue
[out] A pointer to a variant that contains the new property value.

Return Value

Failure on failure and S_OK if successful.

CUtlProps::IsValidValue

Used to validate a value before setting a property.

Syntax

virtual HRESULT CUtlPropsBase::IsValidValue(ULONG /* iCurSet */,
   DBPROP* pDBProp);

Parameters

iCurSet
The index into the property-set array; zero if there is only one property set.

pDBProp
The property ID and new value in a DBPROP structure.

Return Value

A standard HRESULT. The default return value is S_OK.

Remarks

If you have any validation routines you want to run on a value that you are about to use to set a property, you should override this function. For example, you could validate DBPROP_AUTH_PASSWORD against a password table to determine a valid value.

CUtlProps::OnInterfaceRequested

Handles requests for an optional interface when a consumer calls a method on one of the object creation interfaces.

Syntax

virtual HRESULT CUtlPropsBase::OnInterfaceRequested(REFIID riid);

Parameters

riid
[in] The IID for the requested interface. For more details, see the description of the riid parameter of ICommand::Execute in the OLE DB Programmer's Reference (in the MDAC SDK).

Remarks

OnInterfaceRequested handles consumer requests for an optional interface when a consumer calls a method on one of the object creation interfaces (such as IDBCreateSession, IDBCreateCommand, IOpenRowset, or ICommand). It sets the corresponding OLE DB property for the requested interface. For example, if the consumer requests IID_IRowsetLocate, OnInterfaceRequested sets the DBPROP_IRowsetLocate interface. Doing so maintains the correct state during rowset creation.

This method is called when the consumer calls IOpenRowset::OpenRowset or ICommand::Execute.

If a consumer opens an object and requests an optional interface, the provider should set the property associated with that interface to VARIANT_TRUE. To allow property-specific processing, OnInterfaceRequested is called before the provider's Execute method is called. By default, OnInterfaceRequested handles the following interfaces:

  • IRowsetLocate

  • IRowsetChange

  • IRowsetUpdate

  • IConnectionPointContainer

  • IRowsetScroll

If you wish to handle other interfaces, override this function in your data source, session, command, or rowset class to process functions. Your override should go through the normal set/get properties interfaces to ensure that setting properties also sets any chained properties (see OnPropertyChanged).

CUtlProps::OnPropertyChanged

Called after setting a property to handle chained properties.

Syntax

virtual HRESULT OnPropertyChanged(ULONG /* iCurSet */,
   DBPROP* pDBProp);

Parameters

iCurSet
The index into the property-set array; zero if there is only one property set.

pDBProp
The property ID and new value in a DBPROP structure.

Return Value

A standard HRESULT. The default return value is S_OK.

Remarks

If you want to handle chained properties, such as bookmarks or updates whose values are dependent on another property's value, you should override this function.

Example

In this function, the user gets the property ID from the DBPROP* parameter. Now, it is possible to compare the ID against a property to chain. When the property is found, SetProperties is called with the property that will now be set in conjunction with the other property. In this case, if one gets the DBPROP_IRowsetLocate, DBPROP_LITERALBOOKMARKS, or DBPROP_ORDEREDBOOKMARKS property, one can set the DBPROP_BOOKMARKS property.

HRESULT OnPropertyChanged(ULONG /*iCurSet*/, DBPROP* pDBProp)
{
   ATLASSERT(pDBProp != NULL);

   DWORD dwPropertyID = pDBProp->dwPropertyID;

   if (dwPropertyID == DBPROP_IRowsetLocate || 
      dwPropertyID == DBPROP_LITERALBOOKMARKS ||
      dwPropertyID == DBPROP_ORDEREDBOOKMARKS)
   {
      CComVariant var = pDBProp->vValue;

      if (var.boolVal == VARIANT_TRUE)
      {
         // Set the bookmarks property as these are chained
         CComVariant bookVar(true);
         CDBPropSet set(DBPROPSET_ROWSET);
         set.AddProperty(DBPROP_BOOKMARKS, bookVar);

         return SetProperties(1, &set);
      }
   }

   return S_OK;
}

CUtlProps::SetPropValue

Sets a property in a property set.

Syntax

HRESULT SetPropValue(const GUID* pguidPropSet,
   DBPROPID dwPropId,
   VARIANT* pvValue);

Parameters

pguidPropSet
[in] The GUID for the PropSet.

dwPropId
[in] The property index.

pvValue
[in] A pointer to a variant that contains the new property value.

Return Value

Failure on failure and S_OK if successful.

See also

OLE DB Provider Templates
OLE DB Provider Template Architecture