Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şema satır kümeleri, tüketicilerin temel alınan yapısını veya şemasını bilmeden veri deposu hakkında bilgi almasına olanak sağlar. Örneğin, bir veri deposunda kullanıcı tanımlı hiyerarşide düzenlenmiş tablolar olabilir, bu nedenle şemanın okunması dışında bilinmesini sağlamanın hiçbir yolu yoktur. (Başka bir örnek olarak, Visual C++ sihirbazları tüketici için erişimci oluşturmak üzere şema satır kümelerini kullanır.) Tüketicinin bunu gerçekleştirmesine izin vermek için sağlayıcının oturum nesnesi, IDBSchemaRowset arabiriminde yöntemleri kullanıma sunar. Visual C++ uygulamalarında, uygulamak IDBSchemaRowsetiçin IDBSchemaRowsetImpl sınıfını kullanırsınız.
IDBSchemaRowsetImpl aşağıdaki yöntemleri destekler:
CheckRestrictions , şema satır kümesine göre kısıtlamaların geçerliliğini denetler.
CreateSchemaRowset , şablon parametresi tarafından belirtilen nesne için bir COM nesne oluşturucu işlevi uygular.
SetRestrictions , belirli bir şema satır kümesinde hangi kısıtlamaları desteklediğinizi belirtir.
IDBSchemaRowset::GetRowset bir şema satır kümesi döndürür (arabirimden devralınır).
GetSchemas tarafından
IDBSchemaRowsetImpl::GetRowseterişilebilen (arabirimden devralınan) şema satır kümelerinin listesini döndürür.
ATL OLE DB Sağlayıcısı Sihirbazı Desteği
ATL OLE DB Sağlayıcısı sihirbazı Visual Studio 2019 ve sonraki sürümlerde kullanılamaz.
ATL OLE DB Sağlayıcısı Sihirbazı, oturum üst bilgisi dosyasında üç şema sınıfı oluşturur:
CShortNameSessionTRSchemaRowset
CShortNameSessionColSchemaRowset
CShortNameSessionPTSchemaRowset
Bu sınıflar şema bilgileri için tüketici isteklerine yanıt verir; OLE DB belirtiminin bu üç şema satır kümesi için destek gerektirdiğini unutmayın:
CShortNameSessionTRSchemaRowset , tablo bilgileri (DBSCHEMA_TABLES şema satır kümesi) isteklerini işler.
CShortNameSessionColSchemaRowset sütun bilgileri (DBSCHEMA_COLUMNS şema satır kümesi) isteklerini işler. Sihirbaz, bir DOS sağlayıcısı için şema bilgilerini döndüren bu sınıflar için örnek uygulamalar sağlar.
CShortNameSessionPTSchemaRowset , sağlayıcı türü (DBSCHEMA_PROVIDER_TYPES şema satır kümesi) hakkındaki şema bilgilerine yönelik istekleri işler. Sihirbaz tarafından sağlanan varsayılan uygulama S_OK döndürür.
Bu sınıfları, sağlayıcınıza uygun şema bilgilerini işleyecek şekilde özelleştirebilirsiniz:
CShortNameSessionTRSchemaRowset içinde katalog, tablo ve açıklama alanlarını (
trData.m_szType,trData.m_szTablevetrData.m_szDesc) doldurmanız gerekir. Sihirbaz tarafından oluşturulan örnekte yalnızca bir satır (tablo) kullanılır. Diğer sağlayıcılar birden fazla tablo döndürebilir.CShortNameSessionColSchemaRowset'te, tablonun adını olarak
DBIDgeçirirsiniz.
Kısıtlamaları Ayarlama
Şema satır kümesi desteğindeki önemli bir kavram, kullanarak SetRestrictionsyaptığınız kısıtlamaları ayarlamaktır. Kısıtlamalar, tüketicilerin yalnızca eşleşen satırları getirmesine olanak sağlar (örneğin, "MyTable" tablosundaki tüm sütunları bulur). Kısıtlamalar isteğe bağlıdır ve hiçbirinin desteklenmediği durumlarda (varsayılan), tüm veriler her zaman döndürülür. Kısıtlamaları destekleyen bir sağlayıcı örneği için bkz . UpdatePV örneği.
Şema Eşlemesini Ayarlama
UpdatePV'de Session.h dosyasında bunun gibi bir şema eşlemesi ayarlayın:
BEGIN_SCHEMA_MAP(CUpdateSession)
SCHEMA_ENTRY(DBSCHEMA_TABLES, CUpdateSessionTRSchemaRowset)
SCHEMA_ENTRY(DBSCHEMA_COLUMNS, CUpdateSessionColSchemaRowset)
SCHEMA_ENTRY(DBSCHEMA_PROVIDER_TYPES, CUpdateSessionPTSchemaRowset)
END_SCHEMA_MAP()
desteklemek IDBSchemaRowsetiçin DBSCHEMA_TABLES, DBSCHEMA_COLUMNS ve DBSCHEMA_PROVIDER_TYPES desteklemeniz gerekir. kendi takdirinize bağlı olarak ek şema satır kümeleri ekleyebilirsiniz.
içinde gibi CUpdateSessionTRSchemaRowset bir yöntemle şema Execute satır kümesi sınıfı bildirmeUpdatePV:
class CUpdateSessionTRSchemaRowset :
public CSchemaRowsetImpl < CUpdateSessionTRSchemaRowset,
CTABLESRow, CUpdateSession >
...
// Execute looks like this; what pointers does the consumer use?
HRESULT Execute(DBROWCOUNT* pcRowsAffected,
ULONG cRestrictions, const VARIANT* rgRestrictions)
CUpdateSession öğesinden IDBSchemaRowsetImpldevralır, bu nedenle tüm kısıtlama işleme yöntemlerine sahiptir. kullanarak CSchemaRowsetImplüç alt sınıf bildirin (yukarıdaki şema haritasında listelenmiştir): CUpdateSessionTRSchemaRowset, CUpdateSessionColSchemaRowsetve CUpdateSessionPTSchemaRowset. Bu alt sınıfların her biri, ilgili kısıtlama kümesini (arama ölçütleri) işleyen bir Execute yönteme sahiptir. Her Execute yöntem cRestrictions ve rgRestrictions parametrelerinin değerlerini karşılaştırır. SetRestrictions'da bu parametrelerin açıklamasına bakın.
Belirli bir şema satır kümesine karşılık gelen kısıtlamalar hakkında daha fazla bilgi için, Windows SDK'sında OLE DB Programcı Başvurusu'ndaki IDBSchemaRowset'teki şema satır kümesi GUID'leri tablosuna bakın.
Örneğin, DBSCHEMA_TABLES TABLE_NAME kısıtlamasını desteklediyseniz aşağıdakileri yaparsınız:
İlk olarak, DBSCHEMA_TABLES arayın ve dört kısıtlamayı (sırayla) desteklediğini görün.
| Şema satır kümesi kısıtlaması | Kısıtlama değeri |
|---|---|
| TABLE_CATALOG | 0x1 (ikili 1) |
| TABLE_SCHEMA | 0x2 (ikili 10) |
| TABLE_NAME | 0x4 (ikili 100) |
| TABLE_TYPE | 0x8 (ikili 1000) |
Ardından, her kısıtlama için bir bit vardır. Yalnızca TABLE_NAME desteklemek istediğiniz için öğesinde rgRestrictions 0x4 döndürebilirsiniz. TABLE_CATALOG ve TABLE_NAME desteklediyseniz 0x5 (ikili 101) döndürebilirsiniz.
Varsayılan olarak, uygulama herhangi bir istek için 0 döndürür (herhangi bir kısıtlamayı desteklemez). UpdatePV, kısıtlamaları destekleyen bir sağlayıcı örneğidir.
Örnek
Bu kod UpdatePV örneğinden alınır. UpdatePv gerekli üç şema satır kümesi destekler: DBSCHEMA_TABLES, DBSCHEMA_COLUMNS ve DBSCHEMA_PROVIDER_TYPES. Bu konu, sağlayıcınızda şema desteğini uygulamaya yönelik bir örnek olarak DBSCHEMA_TABLE satır kümesini uygulama konusunda size yol gösterir.
Not
Örnek kod, burada listelenenlerden farklı olabilir; örnek kodu daha güncel bir sürüm olarak görmelisinsiniz.
Şema desteği eklemenin ilk adımı, hangi kısıtlamaları destekleyeceğiniz belirlemektir. Şema satır kümeniz için hangi kısıtlamaların kullanılabilir olduğunu belirlemek için, tanımı IDBSchemaRowsetiçin OLE DB belirtimine bakın. Ana tanımın ardından şema satır kümesi adını, kısıtlama sayısını ve kısıtlama sütunlarını içeren bir tablo görürsünüz. Desteklemek istediğiniz şema satır kümesini seçin ve kısıtlama ve kısıtlama sütunlarının sayısını not edin. Örneğin, DBSCHEMA_TABLES dört kısıtlamayı destekler (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME ve TABLE_TYPE):
void SetRestrictions(ULONG cRestrictions, GUID* rguidSchema,
ULONG* rgRestrictions)
{
for (ULONG l=0; l<cRestrictions; l++)
{
if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_TABLES))
rgRestrictions[l] = 0x0C;
else if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_COLUMNS))
rgRestrictions[l] = 0x04;
else if (InlineIsEqualGUID(rguidSchema[l],
DBSCHEMA_PROVIDER_TYPES))
rgRestrictions[l] = 0x00;
}
}
Bit, her kısıtlama sütununu temsil eder. Bir kısıtlamayı desteklemek istiyorsanız (yani, bunu sorgulayabilirsiniz), bu biti 1 olarak ayarlayın. Kısıtlamayı desteklemek istemiyorsanız bu biti sıfır olarak ayarlayın. Yukarıdaki kod satırından, UpdatePV DBSCHEMA_TABLES satır kümesindeki TABLE_NAME ve TABLE_TYPE kısıtlamalarını destekler. Bunlar üçüncü (bit maskesi 100) ve dördüncü (bit maskesi 1000) kısıtlamalarıdır. Bu nedenle, bit UpdatePv maskesi 1100 (veya 0x0C):
if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_TABLES))
rgRestrictions[l] = 0x0C;
Aşağıdaki Execute işlev normal satır kümelerindekine benzer. Üç bağımsız değişkeniniz vardır: pcRowsAffected, cRestrictions ve rgRestrictions. pcRowsAffected değişkeni, sağlayıcının şema satır kümesindeki satır sayısını döndürebileceği bir çıkış parametresidir. cRestrictions parametresi, tüketici tarafından sağlayıcıya geçirilen kısıtlamaların sayısını tutan bir giriş parametresidir. rgRestrictions parametresi, kısıtlama değerlerini tutan BIR VARIANT değerleri dizisidir.
HRESULT Execute(DBROWCOUNT* pcRowsAffected, ULONG cRestrictions,
const VARIANT* rgRestrictions)
cRestrictions değişkeni, sağlayıcının bunları destekleyip desteklemediğine bakılmaksızın bir şema satır kümesi için kısıtlamaların toplam sayısını temel alır. UpdatePv iki kısıtlamayı (üçüncü ve dördüncü) desteklediğinden, bu kod yalnızca üçten büyük veya buna eşit bir cRestrictions değeri arar.
TABLE_NAME kısıtlaması değeri rgRestrictions[2] içinde depolanır (yine sıfır tabanlı dizideki üçüncü kısıtlama 2'dir). Kısıtlamanın gerçekten desteklemek için VT_EMPTY olup olmadığını denetleyin. VT_NULL VT_EMPTY eşit olmadığını unutmayın. VT_NULL geçerli bir kısıtlama değeri belirtir.
UpdatePv Tablo adının tanımı, metin dosyasının tam yol adıdır. Kısıtlama değerini ayıklayın ve dosyanın gerçekten var olduğundan emin olmak için dosyayı açmayı deneyin. Dosya yoksa S_OK döndür. Bu biraz geriye dönük görünebilir, ancak kodun tüketiciye gerçekten belirttiği şey, belirtilen ada göre desteklenen tablo olmadığıdır. S_OK dönüş, kodun doğru şekilde yürütüleceği anlamına gelir.
USES_CONVERSION;
enum {
sizeOfszFile = 255
};
CTABLESRow trData;
FILE *pFile = NULL;
TCHAR szFile[ sizeOfszFile ];
errcode err = 0;
// Handle any restrictions sent to us. This only handles
// the TABLE_NAME & TABLE_TYPE restictions (the 3rd and 4th
// restrictions in DBSCHEMA_TABLES...look in IDBSchemaRowsets
// in part 2 of the prog. ref) so your restrictions are 0x08 & 0x04
// for a total of (0x0C)
if (cRestrictions >= 3 && rgRestrictions[2].vt != VT_EMPTY)
{
CComBSTR bstrName = rgRestrictions[2].bstrVal;
if ((rgRestrictions[2].vt == VT_BSTR) && (bstrName != (BSTR)NULL))
{
// Check to see if the file exists
_tcscpy_s(&szFile[0], sizeOfszFile, OLE2T(bstrName));
if (szFile[0] == _T('\0') ||
((err = _tfopen(&pFile, &szFile[0], _T("r"))) == 0))
{
return S_OK;// Their restriction was invalid return no data
}
else
{
fclose(pFile);
}
}
}
Dördüncü kısıtlamayı (TABLE_TYPE) desteklemek üçüncü kısıtlamaya benzer. Değerin VT_EMPTY olup olmadığını denetleyin. Bu kısıtlama yalnızca TABLO tablo türünü döndürür. DBSCHEMA_TABLES geçerli değerlerini belirlemek için TABLOLAR satır kümesi bölümündeki OLE DB Programcı Başvurusu'nun Ek B bölümüne bakın.
// TABLE_TYPE restriction:
if (cRestrictions >=4 && rgRestrictions[3].vt != VT_EMPTY)
{
CComBSTR bstrType = rgRestrictions[3].bstrVal;
if ((rgRestrictions[3].vt == VT_BSTR) && (bstrType != (BSTR)NULL))
{
// This is kind of a blind restriction.
// This only actually supports
// TABLES so if you get anything else,
// just return an empty rowset.
if (_tcscmp(_T("TABLE"), OLE2T(bstrType)) != 0)
return S_OK;
}
}
Burası, satır kümesi için bir satır girişi oluşturduğunuz yerdir. değişkeni trData , OLE DB sağlayıcı şablonlarında tanımlanan bir yapıya karşılık gelir CTABLESRow. CTABLESRow, OLE DB belirtiminin Ek B'deki TABLES satır kümesi tanımına karşılık gelir. Bir kerede yalnızca bir tabloyu destekleyebileceğinizden, eklenecek tek bir satırınız vardır.
// Bring over the data:
wcspy_s(trData.m_szType, OLESTR("TABLE"), 5);
wcspy_s(trData.m_szDesc, OLESTR("The Directory Table"), 19);
wcsncpy_s(trData.m_szTable, T2OLE(szFile), _TRUNCATE());
UpdatePV yalnızca üç sütun ayarlar: TABLE_NAME, TABLE_TYPE ve AÇIKLAMA. uygulamasını uygularken GetDBStatusbu bilgilere ihtiyacınız olduğundan, bilgilerini döndürebileceğiniz sütunları not edin:
_ATLTRY
{
m_rgRowData.Add(trData);
}
_ATLCATCHALL()
{
return E_OUTOFMEMORY;
}
//if (!m_rgRowData.Add(trData))
// return E_OUTOFMEMORY;
*pcRowsAffected = 1;
return S_OK;
}
İşlev GetDBStatus , şema satır kümesinin doğru çalışması için önemlidir. TABLOLAR satır kümesindeki her sütun için veri döndürmediğiniz için, hangi sütunlar için veri döndürebileceğinizi ve hangilerinin döndürmeyeceğini belirtmeniz gerekir.
virtual DBSTATUS GetDBStatus(CSimpleRow* , ATLCOLUMNINFO* pColInfo)
{
ATLASSERT(pColInfo != NULL);
switch(pColInfo->iOrdinal)
{
case 3: // TABLE_NAME
case 4: // TABLE_TYPE
case 6: // DESCRIPTION
return DBSTATUS_S_OK;
break;
default:
return DBSTATUS_S_ISNULL;
break;
}
}
İşleviniz Execute TABLOLAR satır kümesinden TABLE_NAME, TABLE_TYPE ve AÇIKLAMA alanları için veri döndürdüğünden, OLE DB belirtiminin Ek B bölümüne bakabilir ve 3, 4 ve 6 sıralı olduklarını belirleyebilirsiniz (yukarıdan aşağıya doğru sayarak). Bu sütunların her biri için DBSTATUS_S_OK döndür. Diğer tüm sütunlar için DBSTATUS_S_ISNULL döndür. Bir tüketici, döndürdüğünüz değerin NULL veya başka bir şey olduğunu anlamayabileceği için bu durumu döndürmek önemlidir. Null değerinin boş ile eşdeğer olmadığını unutmayın.
OLE DB şema satır kümesi arabirimi hakkında daha fazla bilgi için OLE DB Programcı Başvurusu'ndaki IDBSchemaRowset arabirimine bakın.
Tüketicilerin yöntemleri nasıl kullanabileceği IDBSchemaRowset hakkında bilgi için bkz . Şema Satır Kümeleri ile Meta Verileri Alma.
Şema satır kümelerini destekleyen bir sağlayıcı örneği için bkz . UpdatePV örneği.