Aracılığıyla paylaş


Tüketiciye Döndürülecek Olan Sütunları Dinamik Olarak Belirleme

PROVIDER_COLUMN_ENTRY makroları normal olarak IColumnsInfo::GetColumnsInfo çağrısını işler.Ancak, tüketici yer işaretleri kullanmayı seçmiş olabileceği için, sağlayıcı tüketicinin yer işaretlerini sorup sormadığına bağlı olarak döndürülen sütunları değiştirebilmelidir.

IColumnsInfo::GetColumnsInfo çağrısını işlemek için MyProviderRS.h'deki CAgentMan kullanıcı kaydından bir GetColumnInfo işlevi tanımlayan PROVIDER_COLUMN_MAP'i silin ve kendi GetColumnInfo işlevinizin tanımıyla değiştirin.

////////////////////////////////////////////////////////////////////////
// MyProviderRS.H
class CAgentMan
{
public:
   DWORD dwBookmark;
   TCHAR szCommand[256];
   TCHAR szText[256];
   TCHAR szCommand2[256];
   TCHAR szText2[256];

   static ATLCOLUMNINFO* GetColumnInfo(void* pThis, ULONG* pcCols);
   bool operator==(const CAgentMan& am)
   {
      return (lstrcmpi(szCommand, am.szCommand) == 0);
   }

};

Sonra, aşağıdaki kodda gösterilen şekilde MyProviderRS.cpp içindeki GetColumnInfo işlevini uygulayın.

GetColumnInfo öncelikle OLE DB özelliğinin dbprop_bookmarks ayarlanıp ayarlanmadığını denetler.Özelliği almak için GetColumnInfo öğesi satır kümesi nesnesine bir işaretçi (pRowset) kullanır.pThis İşaretçisi özellik eşlemesinin depolandığı sınıfın satır kümesini oluşturan sınıfı temsil eder.GetColumnInfo, pThis işaretçisini bir RMyProviderRowset işaretçisine tür olarak atar.

DBPROP_BOOKMARKS özelliğini denetlemek için, GetColumnInfo, pRowset arayüzünden QueryInterface öğesini çağırarak elde edebileceğiniz IRowsetInfo arabirimini kullanır.Alternatif olarak, ATL CComQIPtr yöntemini kullanabilirsiniz.

////////////////////////////////////////////////////////////////////
// MyProviderRS.cpp
ATLCOLUMNINFO* CAgentMan::GetColumnInfo(void* pThis, ULONG* pcCols)
{
   static ATLCOLUMNINFO _rgColumns[5];
   ULONG ulCols = 0;
            
   // Check the property flag for bookmarks; if it is set, set the zero 
   // ordinal entry in the column map with the bookmark information.
   CAgentRowset* pRowset = (CAgentRowset*) pThis;
   CComQIPtr<IRowsetInfo, &IID_IRowsetInfo> spRowsetProps = pRowset;

   CDBPropIDSet set(DBPROPSET_ROWSET);
   set.AddPropertyID(DBPROP_BOOKMARKS);
   DBPROPSET* pPropSet = NULL;
   ULONG ulPropSet = 0;
   HRESULT hr;

   if (spRowsetProps)
      hr = spRowsetProps->GetProperties(1, &set, &ulPropSet, &pPropSet);

   if (pPropSet)
   {
      CComVariant var = pPropSet->rgProperties[0].vValue;
      CoTaskMemFree(pPropSet->rgProperties);
      CoTaskMemFree(pPropSet);
      
      if (SUCCEEDED(hr) && (var.boolVal == VARIANT_TRUE))
      {
         ADD_COLUMN_ENTRY_EX(ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD), 
         DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, dwBookmark, 
         DBCOLUMNFLAGS_ISBOOKMARK)
         ulCols++;
      }
   }

   // Next, set the other columns up.
   ADD_COLUMN_ENTRY(ulCols, OLESTR("Command"), 1, 256, DBTYPE_STR, 0xFF, 0xFF, 
      GUID_NULL, CAgentMan, szCommand)
   ulCols++;
   ADD_COLUMN_ENTRY(ulCols, OLESTR("Text"), 2, 256, DBTYPE_STR, 0xFF, 0xFF, 
      GUID_NULL, CAgentMan, szText)
   ulCols++;

   ADD_COLUMN_ENTRY(ulCols, OLESTR("Command2"), 3, 256, DBTYPE_STR, 0xFF, 0xFF, 
      GUID_NULL, CAgentMan, szCommand2)
   ulCols++;
   ADD_COLUMN_ENTRY(ulCols, OLESTR("Text2"), 4, 256, DBTYPE_STR, 0xFF, 0xFF, 
      GUID_NULL, CAgentMan, szText2)
   ulCols++;

   if (pcCols != NULL)
      *pcCols = ulCols;

   return _rgColumns;
}

Bu örnek, sütun bilgisini saklamak için statik bir dizi kullanır.Tüketici yer işareti sütunu istemezse, dizideki bir girdi kullanılmamış olur.Bilgiyi işlemek için iki dizi makrosu oluşturun: ADD_COLUMN_ENTRY ve ADD_COLUMN_ENTRY_EX.ADD_COLUMN_ENTRY_EX, bir yer imi sütunu tanımlamanız durumunda gerek duyulacak ek bir parametre (flags) alır.

////////////////////////////////////////////////////////////////////////
// MyProviderRS.h

#define ADD_COLUMN_ENTRY(ulCols, name, ordinal, colSize, type, precision, 
scale, guid, dataClass, member) \
   _rgColumns[ulCols].pwszName = (LPOLESTR)name; \
   _rgColumns[ulCols].pTypeInfo = (ITypeInfo*)NULL; \
   _rgColumns[ulCols].iOrdinal = (ULONG)ordinal; \
   _rgColumns[ulCols].dwFlags = 0; \
   _rgColumns[ulCols].ulColumnSize = (ULONG)colSize; \
   _rgColumns[ulCols].wType = (DBTYPE)type; \
   _rgColumns[ulCols].bPrecision = (BYTE)precision; \
   _rgColumns[ulCols].bScale = (BYTE)scale; \
   _rgColumns[ulCols].cbOffset = offsetof(dataClass, member);

#define ADD_COLUMN_ENTRY_EX(ulCols, name, ordinal, colSize, type, 
precision, scale, guid, dataClass, member, flags) \
   _rgColumns[ulCols].pwszName = (LPOLESTR)name; \
   _rgColumns[ulCols].pTypeInfo = (ITypeInfo*)NULL; \
   _rgColumns[ulCols].iOrdinal = (ULONG)ordinal; \
   _rgColumns[ulCols].dwFlags = flags; \
   _rgColumns[ulCols].ulColumnSize = (ULONG)colSize; \
   _rgColumns[ulCols].wType = (DBTYPE)type; \
   _rgColumns[ulCols].bPrecision = (BYTE)precision; \
   _rgColumns[ulCols].bScale = (BYTE)scale; \
   _rgColumns[ulCols].cbOffset = offsetof(dataClass, member); \
   memset(&(_rgColumns[ulCols].columnid), 0, sizeof(DBID)); \
   _rgColumns[ulCols].columnid.uName.pwszName = (LPOLESTR)name;

GetColumnInfo yer imi makro işlevi aşağıdaki gibi kullanılır:

ADD_COLUMN_ENTRY_EX(ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD),
   DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, dwBookmark, 
   DBCOLUMNFLAGS_ISBOOKMARK)

Artık gelişmiş sağlayıcıyı derleyebilir ve çalıştırabilirsiniz.Sağlayıcıyı test etmek için test tüketicisini Basit Bir Tüketici Uygulamak konusunda açıklandığı gibi değiştirin.Test tüketicisini sağlayıcı ile çalıştırın.Test Tüketicisi iletişim kutusundaki Çalıştır düğmesini tıklattığınızda test tüketicisinin sağlayıcıdan uygun ayarları aldığını doğrulayın.

Ayrıca bkz.

Başvuru

Basit Salt Okunur Sağlayıcıyı Geliştirme