Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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;
}