Dinamik sütunlar belirleme tüketiciye iade

PROVIDER_COLUMN_ENTRY makroları normal IColumnsInfo::GetColumnsInfo çağrısı işleci. Tüketici ya da yer imleri kullanmayı seçebilirsiniz değil çünkü, ancak sağlayıcı tüketici için yer işareti olup olmadığını soran üzerine bağlı olarak döndürülen sütunları değiştirmek gerekir.

IColumnsInfo::GetColumnsInfo çağrı ele PROVIDER_COLUMN_MAP Sil (olan bir işlevi tanımlar _GetColumnInfo ) dan CAgentMan kullanıcı kayıt içinde MyProviderRS.h ve onun yerine kendi tanımı _GetColumnInfo fonksiyonu

////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.H
sınıf C&AgentMan
{
public:
   dword dwBookmark;
   tchar szCommand [256];
   tchar szText [256];
   tchar szCommand2 [256];
   tchar szText2 [256];

statik ATLCOLUMNINFO * (void * pThis, ulong * pcCols); _GetColumnInfo
   bool operator == (const CAgentManamp; am)
   {
      Return (lstrcmpi (szCommand, am.szCommand) == 0);
   }

}

Ardından, uygulamaya _GetColumnInfo işlevi MyProviderRS.cpp içinde aşağıdaki kodda gösterildiği gibi.

_GetColumnInfoilk DBPROP_IRowsetLocate ole db özelliği ayarlanmış olup olmadığını görmek için denetler. Emlak almak için _GetColumnInfo işaretçisi kullanır ( pRowset ) satır kümesi nesnesi. pThisİşaretçisinin temsil eder (Bu sınıf özellik eşleme depolandığı) satır kümesi oluşturduğunuz sınıf. _GetColumnInfo typecasts pThis için işaretçi bir RMyProviderRowset işaretçisi.

DBPROP_IRowsetLocate özelliği, kontrol etmek için _GetColumnInfo üzerinde arama QueryInterface tarafından elde edebilirsiniz IRowsetInfo arabirimini kullanan pRowset arabirimi. (Alternatif olarak, bir atl CComQIPtr yerine kullanabilirsiniz.)

////////////////////////////////////////////////////////////////////
/ / MyProviderRS.cpp
ATLCOLUMNINFO * CAgentMan::_GetColumnInfo(void* pThis, ULONG* pcCols)
{
   statik ATLCOLUMNINFO _rgColumns [5];
   ulong ulCols = 0;
            
   / / Kontrol eğer onun sıfır sıra ayarlayın yer imleri, özellik bayrağı
   / / giriş sütun imi bilgileri göster.
   CAgentRowset * pRowset (CAgentRowset *) pThis; =
   CComQIPtrlt; IRowsetInfo & IID_IRowsetInfo > spRowsetProps = pRowset;

CDBPropIDSet set(DBPROPSET_ROWSET);
   ayarlayın.AddPropertyID(DBPROP_BOOKMARKS);
   dbpropset * pPropSet = null;
   ulong ulPropSet = 0;
   hresult hr;

Eğer (spRowsetProps)
      hr = spRowsetProps - > GetProperties (1 set, ulPropSet & pPropSet);

Eğer (pPropSet)
   {
      CComVariant var pPropSet = > rgProperties [0] .vvalue;
      CoTaskMemFree (pPropSet - > rgProperties);
      CoTaskMemFree(pPropSet);
      
      Eğer (SUCCEEDED(hr) & & (var.boolVal varıant_true ==))
      {
         add_column_entry_ex (ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD), dbtype_bytes, 0, 0, GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)
         ulCols ++;
      }
   }

/ / Sonraki diğer sütunlar ayarlayın.
   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 ++;

Eğer (pcCols! = null)
      * pcCols = ulCols;

return _rgColumns;
}

Bu örnek, sütun bilgileri içeren statik bir dizi kullanır. Tüketici yer imi sütun istemiyorsa, dizideki tek bir giriş kullanılmaz. Bilgileri işlemek için iki dizi makrolar, add_column_entry ve add_column_entry_exoluşturun. add_column_entry_ex ek bir parametre alır flags , yani bir yer imi sütun belirtmek gerekli.

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

# define &add_column_entry (ulCols, adı, sıra, colSize, türü, duyarlık, ölçek, GUID, dataClass, üye) \
   _rgColumns [ulCols] .pwszname = (lpolestr) adı; \
   _rgColumns [ulCols] .ptypeinfo = (ITypeInfo *) null; \
   _rgColumns [ulCols] .iordinal (ulong) sıra; = \
   _rgColumns [ulCols] .dwflags = 0; \
   _rgColumns [ulCols] .ulcolumnsize = (ulong) colSize; \
   _rgColumns [ulCols] .wtype = (dbtype) türü; \
   _rgColumns [ulCols] .bprecision (byte) hassas; = \
   _rgColumns [ulCols] .bscale = (bayt) ölçek; \
   _rgColumns [ulCols] .cboffset offsetof (dataClass, üye); =

# define add_column_entry_ex (ulCols, adı, sıra, colSize, türü, duyarlık, ölçek, GUID, dataClass, üye, bayraklar) \
   _rgColumns [ulCols] .pwszname = (lpolestr) adı; \
   _rgColumns [ulCols] .ptypeinfo = (ITypeInfo *) null; \
   _rgColumns [ulCols] .iordinal (ulong) sıra; = \
   _rgColumns [ulCols] .dwflags bayrakları; = \
   _rgColumns [ulCols] .ulcolumnsize = (ulong) colSize; \
   _rgColumns [ulCols] .wtype = (dbtype) türü; \
   _rgColumns [ulCols] .bprecision (byte) hassas; = \
   _rgColumns [ulCols] .bscale = (bayt) ölçek; \
   _rgColumns [ulCols] .cboffset offsetof (dataClass, üye); = \
   memset(amp;(_rgColumns[ulCols].columnid), 0, sizeof(DBID)); \
   _rgColumns [ulCols].columnid.uName.pwszName = (lpolestr) adı

İçinde _GetColumnInfo işlevi, yer imi makro şöyle kullanılır:

Add_column_entry_ex (ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD),
   dbtype_bytes, 0, 0, GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)

Şimdi, derlemek ve Gelişmiş sağlayıcı çalıştırın. Sağlayıcı sınamak için sınama tüketici, tüketici ile gelişmiş sağlayıcısı kullanmak için değiştirmeaçıklandığı gibi değiştirin. Sınama tüketici sağlayıcı ile çalıştırın. Sınama tüketici iletişim kutusunda Çalıştır düğmesini tıklattığınızda sınama tüketici sağlayıcıdan uygun dizeleri alır doğrulayın.

Geri bir ole db şablon sağlayıcı uygulamak için

Index