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

📄 irowsetscrollimpl.h

📁 The ATL OLE DB Provider templates only seem to support read-only rowsets and making them support upd
💻 H
字号:
#ifndef __I_ROWSET_SCROLL_IMPL__INCLUDED__
#define __I_ROWSET_SCROLL_IMPL__INCLUDED__

#include "IRowsetLocateImpl.h"

template <class T, class Base>
class ATL_NO_VTABLE CRowsetScrollImpl;

template <class T>
class ATL_NO_VTABLE IRowsetScrollImpl : public CRowsetScrollImpl<T, IRowsetScroll>
{
};

template <class T, class Base>
class ATL_NO_VTABLE CRowsetScrollImpl : public CRowsetLocateImpl<T, Base>
{
   public:

      STDMETHOD(GetApproximatePosition)(
         HCHAPTER hChapter,
         ULONG cbBookmark,
         const BYTE *pBookmark,
         ULONG *pulPosition,
         ULONG *pcRows)
      {
         ATLTRACE2(atlTraceDBProvider, 0, "IRowsetScroll::GetApproximatePosition()\n");

         T *pT = (T*)this;

         if (hChapter != DB_NULL_HCHAPTER)
         {
            ATLTRACE2(atlTraceDBProvider, 0, "IRowsetScroll::GetApproximatePosition - (hChapter != DB_NULL_HCHAPTER)\n");
            
            return E_FAIL;
         }

         if (cbBookmark == 0)
         {
            // Ignore pBookmark
         
            if (pulPosition)
            {
               *pulPosition = 0;
            }

            if (pcRows)
            {
               *pcRows = pT->GetNumRows();   
            }
         }
         else 
         {
            if (!pBookmark)
            {
               ATLTRACE2(atlTraceDBProvider, 0, "IRowsetScroll::GetApproximatePosition - (cbBookmark != 0 && !pBookmark)\n");
               
               return E_INVALIDARG;
            }

            if (pulPosition)
            {
               if (cbBookmark == 1)
               {
                  if (*(DBBOOKMARK*)pBookmark == DBBMK_FIRST)
                  {
                     *pulPosition = 1;
                  }
                  else if (*(DBBOOKMARK*)pBookmark == DBBMK_LAST)
                  {
                     *pulPosition = pT->GetNumRows();   
                  }
                  else if (*(DBBOOKMARK*)pBookmark == DBBMK_INVALID)
                  {
                     return DB_E_BADBOOKMARK;
                  }
               }
               else if (cbBookmark == sizeof(DWORD))
               {
                  // the bookmark is the row index...
               
                  DWORD bookmark = *(DWORD*)pBookmark;

                  if (bookmark < 1 || bookmark > pT->GetNumRows())
                  {
                     return DB_E_BADBOOKMARK;
                  }
               
                  *pulPosition = bookmark; 
               }
               else
               {
                  ATLTRACE2(atlTraceDBProvider, 0, "IRowsetScroll::GetApproximatePosition - (cbBookmark != sizeof(DWORD))\n");
            
                  return E_FAIL;
               }
            }

            if (pcRows)
            {
               *pcRows = pT->GetNumRows();
            }
         }

         return S_OK;
      }

      STDMETHOD(GetRowsAtRatio)(
         HWATCHREGION hReserved1,
         HCHAPTER hChapter,
         ULONG ulNumerator,
         ULONG ulDenominator,
         LONG cRows,
         ULONG *pcRowsObtained,
         HROW **prghRows)
      {
         ATLTRACE2(atlTraceDBProvider, 0, "IRowsetScroll::GetRowsAtRatio()\n");

         return E_NOTIMPL;
      }
};

#endif // __I_ROWSET_SCROLL_IMPL__INCLUDED__

⌨️ 快捷键说明

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