⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conversionproviderrs.cpp

📁 The ATL OLE DB Provider templates only seem to support read-only rowsets and making them support upd
💻 CPP
字号:
// Implementation of the CConversionProviderCommand
#include "stdafx.h"
#include "SimpleDataObject.h"
#include "DataObjectRowset.h"
#include "IGetAsOLEDBRowset_i.c"
/////////////////////////////////////////////////////////////////////////////
// CConversionProviderCommand
HRESULT CConversionProviderCommand::Execute(
   IUnknown *pUnkOuter, 
   REFIID riid, 
   DBPARAMS *pParams, 
   LONG *pcRowsAffected, 
   IUnknown **ppRowset)
{
   ATLTRACE2(atlTraceDBProvider, 0, "CConversionProviderCommand::Execute()\n");

   // This code must be here as the parameters are connected to the command's accessor, not
   // the rowsets... and we dont copy the accessors across yet...

   if (m_strCommandText ==  _T("CONVERT"))
   {
      // We must have a paramter passed to us.

      if (!pParams || 
          !pParams->pData ||
          pParams->cParamSets != 1 || 
          pParams->hAccessor == 0)
      {
         ATLTRACE2(atlTraceDBProvider, 0, "CConversionProviderCommand::Execute called with no parameters\n");
         return E_FAIL;
      }
   
      DBACCESSORFLAGS dwAccessorFlags = 0;
      ULONG cBindings = 0; 
      DBBINDING *prgBindings = 0;

      HRESULT hr = GetBindings(pParams->hAccessor, 
            &dwAccessorFlags, 
            &cBindings, 
            &prgBindings );

      if (hr != S_OK)
      {
         return E_FAIL;
      }

      // can it be anything other than an unknown?

      VARIANT &param = *(VARIANT*)((unsigned char*)(pParams->pData) + prgBindings[0].obValue);

      if (param.vt != VT_UNKNOWN)
      {
         return E_FAIL;
      }

      IUnknown *pUnk = param.punkVal;

      // At this point we have a pointer to the object that we want to create a rowset on, 

      pUnk->AddRef();

      _IGetAsOLEDBRowset *pGetAsRowset = 0;

      hr = pUnk->QueryInterface(IID__IGetAsOLEDBRowset, (void**)&pGetAsRowset);

      pUnk->Release();

      if (SUCCEEDED(hr))
      {
         // we now have a pointer to the thing that knows how to give us a rowset...
         // Make it so...

         IUnknown *pOurUnknown = 0;
      
         hr = QueryInterface(IID_IUnknown, (void**)&pOurUnknown); 

         if (SUCCEEDED(hr))
         {
            hr = pGetAsRowset->GetAsRowset(pOurUnknown, pUnkOuter, riid, pcRowsAffected, ppRowset);

            pOurUnknown->Release();
         }

         pGetAsRowset->Release();
      }

      return hr;
   }
   
   return DB_E_NOTABLE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -