Compartilhar via


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;
}