Command Object Example
The code in this example shows how to create and execute a command object.
/////////////////////////////////////////////////////////////////
// myCreateCommand
//
// This function takes an IUnknown pointer on a Session object
// and attempts to create a Command object using the Session's
// IDBCreateCommand interface. Since this interface is optional,
// this may fail.
//
/////////////////////////////////////////////////////////////////
HRESULT myCreateCommand
(
IUnknown * pUnkSession,
IUnknown ** ppUnkCommand
)
{
HRESULT hr;
IDBCreateCommand * pIDBCreateCommand = NULL;
// Attempt to create a Command object from the Session object
XCHECK_HR(hr = pUnkSession->QueryInterface(
IID_IDBCreateCommand, (void**)&pIDBCreateCommand));
XCHECK_HR(hr = pIDBCreateCommand->CreateCommand(
NULL, //pUnkOuter
IID_ICommand, //riid
ppUnkCommand //ppCommand
));
CLEANUP:
if( pIDBCreateCommand )
pIDBCreateCommand->Release();
return hr;
}
/////////////////////////////////////////////////////////////////
// myExecuteCommand
//
// This function takes an IUnknown pointer on a Command object
// and performs the following steps to create a new Rowset
// object:
// - sets the given properties on the Command object; these
// properties will be applied by the provider to any Rowset
// created by this Command
// - sets the given command text for the Command
// - executes the command to create a new Rowset object
//
/////////////////////////////////////////////////////////////////
HRESULT myExecuteCommand
(
IUnknown * pUnkCommand,
WCHAR * pwszCommandText,
ULONG cPropSets,
DBPROPSET* rgPropSets,
IUnknown ** ppUnkRowset
)
{
HRESULT hr;
ICommandText * pICommandText = NULL;
ICommandProperties * pICommandProperties = NULL;
// Set the properties on the Command object
XCHECK_HR(hr = pUnkCommand->QueryInterface(
IID_ICommandProperties, (void**)&pICommandProperties));
XCHECK_HR(hr = pICommandProperties->SetProperties(cPropSets, rgPropSets));
// Set the text for this Command, using the default command text
// dialect. All providers that support commands must support this
// dialect and providers that support SQL must be able to recognize
// an SQL command as SQL when this dialect is specified
XCHECK_HR(hr = pUnkCommand->QueryInterface(
IID_ICommandText, (void**)&pICommandText));
XCHECK_HR(hr = pICommandText->SetCommandText(
DBGUID_DEFAULT, //guidDialect
pwszCommandText //pwszCommandText
));
// And execute the Command. Note that the user could have
// entered a non-row returning command, so we will check for
// that and return failure to prevent the display of the
// non-existant rowset by the caller
XCHECK_HR(hr = pICommandText->Execute(
NULL, //pUnkOuter
IID_IRowset, //riid
NULL, //pParams
NULL, //pcRowsAffected
ppUnkRowset //ppRowset
));
if( !*ppUnkRowset )
{
printf("\nThe command executed successfully, but did not " \
"return a rowset.\nNo rowset will be displayed.\n");
hr = E_FAIL;
}
CLEANUP:
if( pICommandText )
pICommandText->Release();
if( pICommandProperties )
pICommandProperties->Release();
return hr;
}