Udostępnij za pośrednictwem


Wspieranie schematu zestawów wierszy.

Schemat wierszy pozwalają konsumentom uzyskanie informacji o magazynie danych bez znajomości jego podstawowej struktury lub schematu.Na przykład magazyn danych może być zorganizowane w hierarchii zdefiniowany przez użytkownika, co byłoby sposobem zapewnienia wiedzy schematu z wyjątkiem przez odczytanie ich tabel.(Przykład Uwaga kreatorów Visual C++ wygenerować akcesorów dla konsumenta za pomocą schematu wierszy). Aby zezwolić na konsumentów w tym celu, obiekt session Dostawca udostępnia metody na IDBSchemaRowset interfejsu.W aplikacji Visual C++, za pomocą IDBSchemaRowsetImpl klasy implementującej IDBSchemaRowset.

IDBSchemaRowsetImplobsługuje następujące metody:

  • CheckRestrictions sprawdza ważność ograniczeń dotyczących wierszy schematu.

  • CreateSchemaRowset implementuje funkcję twórca obiektu COM dla obiektu określonego przez parametr szablonu.

  • SetRestrictions określa ograniczenia, które obsługują na wierszy określonego schematu.

  • IDBSchemaRowset::GetRowset zwraca zestawu wierszy schematu (dziedziczonej z interfejsu).

  • GetSchemas zwraca listę zestawów wierszy schematu dostępne przez IDBSchemaRowsetImpl::GetRowset (dziedziczonej z interfejsu).

ATL OLE DB Provider Kreator wsparcia

ATL OLE DB Provider Kreator tworzy trzy klasy schematu w pliku nagłówkowym sesji:

  • CNazwa_skróconaSessionTRSchemaRowset

  • CNazwa_skróconaSessionColSchemaRowset

  • CNazwa_skróconaSessionPTSchemaRowset

Klasy te odpowiedzi na żądania konsumentów informacji o schemacie; Uwaga specyfikacji OLE DB wymaga, wspierana tych trzech schematu zestawów wierszy:

  • CskróconąSessionTRSchemaRowset obsługuje żądania informacji o tabeli ( DBSCHEMA_TABLES schemat wierszy).

  • CskróconąSessionColSchemaRowset obsługuje żądania informacji o kolumnie ( DBSCHEMA_COLUMNS schemat wierszy).Kreator dostarcza przykładowe implementacje dla tych klas, które zwraca informacje o schemacie dla dostawcy DOS.

  • CskróconąSessionPTSchemaRowset obsługuje żądania dla schematu informacje o typie Dostawca ( DBSCHEMA_PROVIDER_TYPES schemat wierszy).Zwraca wartość domyślna implementacja przez kreatora S_OK.

Można dostosować te klasy obsługi informacji o schemacie, odpowiednie do Twojego dostawcy:

  • W cSkrócona_nazwaSessionTRSchemaRowset, musisz wypełnić pola wykazu, tabeli i opis (trData.m_szType, trData.m_szTable, i trData.m_szDesc).Przykład wygenerowany przez Kreatora używa tylko jeden wiersz (tabela).Innych dostawców może zwrócić więcej niż jednej tabeli.

  • W cNazwa_skróconaSessionColSchemaRowset, przekazać nazwę tabeli, jako identyfikator DBID.

Ustawianie ograniczeń

Ważnym pojęciem obsługi wierszy schematu jest ustawienie ograniczenia, które można wykonać za pomocą SetRestrictions.Ograniczenia pozwalają konsumentom do pobrania tylko pasujące wiersze (na przykład znaleźć wszystkie kolumny w tabeli "MojaTabela").Ograniczenia są opcjonalne, a w przypadku, w których żaden nie jest obsługiwane (domyślnie), wszystkie dane jest zawsze zwracana.Na przykład dostawca, który obsługuje ograniczeń, zobacz UpdatePV próbki.

Definiowanie mapy schematu

Konfigurowanie mapy schematu, taką jak poniżej w Session.h w UpdatePV:

BEGIN_SCHEMA_MAP(CUpdateSession)
    SCHEMA_ENTRY(DBSCHEMA_TABLES, CUpdateSessionTRSchemaRowset)
    SCHEMA_ENTRY(DBSCHEMA_COLUMNS, CUpdateSessionColSchemaRowset)
    SCHEMA_ENTRY(DBSCHEMA_PROVIDER_TYPES, CUpdateSessionPTSchemaRowset)
END_SCHEMA_MAP()

Do obsługi IDBSchemaRowset, musi obsługiwać DBSCHEMA_TABLES, DBSCHEMA_COLUMNS, i DBSCHEMA_PROVIDER_TYPES.Można dodać schematu dodatkowych wierszy według uznania użytkownika.

Zadeklarować klasy schematu zestawu wierszy z Execute metody, takie jak CUpdateSessionTRSchemaRowset w UpdatePV:

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)

Należy zauważyć, że CUpdateSession dziedziczy z IDBSchemaRowsetImpl, więc wszystkie ograniczenia obsługi metod.Za pomocą CSchemaRowsetImpl, zadeklarować trzy klasy podrzędne (wymienione w powyższej mapie schematu): CUpdateSessionTRSchemaRowset, CUpdateSessionColSchemaRowset, i CUpdateSessionPTSchemaRowset.Każda z tych klas podrzędnych ma Execute metoda, która obsługuje jej zestaw odpowiednich ograniczeń (kryteria wyszukiwania).Każdy Execute metoda porównuje wartości cRestrictions i rgRestrictions parametry.Zobacz opis tych parametrów w SetRestrictions.

Więcej informacji na temat ograniczeń odpowiadają wierszy określonego schematu, można znaleźć w tabeli wierszy schematu GUID w IDBSchemaRowset w OLE DB Programmer's Reference w Windows SDK.

Na przykład, jeśli użytkownik obsługiwane nazwa_tabeli ograniczenia w DBSCHEMA_TABLES, będzie wykonać następujące czynności:

Po pierwsze, wyszukiwanie DBSCHEMA_TABLES i zobacz, czy obsługuje on cztery ograniczenia (zamówienia).

Ograniczenie wierszy schematu

Wartość ograniczenia

TABLE_CATALOG

0x1 (1 binarne)

TABLE_SCHEMA

0x2 (10 binarne)

NAZWA_TABELI

0x4 (100 binarne)

TABLE_TYPE

0x8 (1000 binarne)

Następnie Uwaga jest jeden bit w każdym ograniczeń.Ponieważ ma obsługiwać nazwa_tabeli , zwróci 0x4 w rgRestrictions element.Jeśli użytkownik obsługiwane TABLE_CATALOG i nazwa_tabeli, zwróci 0x5 (101 binarny).

Domyślnie implementacja zwraca 0 (nie obsługuje żadnych ograniczeń) dla każdego wniosku.UpdatePV jest przykładem dostawcy, który obsługuje ograniczeń.

45xw3aba.collapse_all(pl-pl,VS.110).gifPrzykład

Ten kod jest pobierany z UpdatePV próbki.UpdatePv obsługuje trzy zestawy wierszy wymagana schematu: DBSCHEMA_TABLES, DBSCHEMA_COLUMNS, i DBSCHEMA_PROVIDER_TYPES.Na przykład o implementowaniu obsługi schematu w dostawcy w tym temacie przejście przez wprowadzenie DBSCHEMA_TABLE zestawu wierszy.

[!UWAGA]

Przykładowy kod mogą różnić się od wymienione w tym miejscu; Przykładowy kod powinno być traktowane jako bardziej aktualnej wersji.

Pierwszym krokiem podczas dodawania obsługi schematu jest ustalenie ograniczeń, które będzie obsługiwany.Aby określić ograniczenia, które są dostępne dla użytkownika wierszy schematu, spójrz na specyfikacji OLE DB dla definicji IDBSchemaRowset.Po głównym definicji Zobacz temat tabeli zawierającej nazwy schematu zestawu wierszy, liczba ograniczeń i kolumny ograniczeń.Wybierz schemat zestawu wierszy, do wspierania i zanotuj numer ograniczeń i ograniczenie kolumn.Na przykład DBSCHEMA_TABLES obsługuje cztery ograniczeń (TABLE_CATALOG, TABLE_SCHEMA, nazwa_tabeli, i 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 reprezentuje każda kolumna ograniczeń.Jeśli chcesz obsługiwać ograniczenie (to znaczy, że można wysyłać kwerendy przez nią), ustawienia tego bitu wartość 1.Jeśli nie chcesz obsługiwać ograniczenia, należy ustawić ten bit do zera.W wierszu kodu powyżej obsługuje UpdatePV nazwa_tabeli i TABLE_TYPE ograniczenia w DBSCHEMA_TABLES zestawu wierszy.Są to trzecia (maska bitowa 100) i czwarty ograniczeń (maska bitowa 1000).Dlatego maski bitów dla UpdatePv jest 1100 (lub 0x0C):

    if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_TABLES))
        rgRestrictions[l] = 0x0C;

Następujące Execute funkcja jest podobne do tych w regularnych zestawów wierszy.Mają trzy argumenty: pcRowsAffected, cRestrictions, i rgRestrictions.pcRowsAffected Zmienna jest parametrem wyjściowym, dostawca może zwracać liczba wierszy w zestawie wierszy schematu.cRestrictions Parametr jest parametrem wejściowym, zawierającą liczbę ograniczeń przekazany przez konsumenta do dostawcy.rgRestrictions Parametr jest tablicą WARIANTU wartości, które zawierają wartości ograniczeń.

    HRESULT Execute(DBROWCOUNT* pcRowsAffected, ULONG cRestrictions, 
                    const VARIANT* rgRestrictions)

cRestrictions Zmienna opiera się na całkowitą liczbę ograniczeń dla wierszy schematu, niezależnie od tego, czy usługodawca obsługuje je.Ponieważ UpdatePv obsługuje dwa ograniczenia (trzecim i czwartym), ten kod wygląda cRestrictions wartość większą niż lub równy trzy.

Wartość dla nazwa_tabeli ograniczenia są przechowywane w rgRestrictions[2] (ponownie, trzeci ograniczeń w tablicę indeksowaną od zera jest 2).Trzeba sprawdzić, że ograniczenie nie jest VT_EMPTY do faktycznie go obsługuje.Należy zauważyć, że VT_NULL nie jest równa VT_EMPTY.VT_NULL określa wartość prawidłowym ograniczeniem.

Definicja UpdatePv Nazwa tabeli jest nazwa w pełni kwalifikowana ścieżka do pliku tekstowego.Wyodrębnianie wartości ograniczeń i próba otwarcia pliku w celu zapewnienia, że plik rzeczywiście istnieją.Jeśli plik nie istnieje, zwracają S_OK.Mogą wydawać się nieco Wstecz, ale kod jakie naprawdę informuje konsumenta jest istniały żadnych tabel obsługiwanych określona nazwa.S_OK Return oznacza, że kod wykonywany prawidłowo.

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);
        }
    }
}

Wspieranie czwarty ograniczeń (TABLE_TYPE) jest podobny do trzeciego ograniczeń.Sprawdź, czy wartość nie jest VT_EMPTY.Ograniczenie to zwraca tylko typ tabeli tabeli.Aby określić prawidłowe wartości dla DBSCHEMA_TABLES, Szukaj w dodatku b OLE DB Programmer's Reference w tabel sekcji zestawu wierszy.

// 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;
    }
}

Jest to, gdzie faktycznie utworzyć wpis wiersza dla zestawu wierszy.Zmienna trData odpowiada CTABLESRow, struktury, zdefiniowane w szablonach dostawcy OLE DB.CTABLESRow odpowiada tabel definicji wierszy w dodatku b specyfikacji OLE DB.Masz tylko jeden wiersz, aby dodać, ponieważ jednocześnie może obsługiwać tylko jedną tabelę.

// 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 ustawia tylko trzy kolumny: nazwa_tabeli, TABLE_TYPE, i Opis.Należy Uwaga kolumn, dla których zwraca się informacji, ponieważ informacje te są potrzebne podczas implementowania GetDBStatus:

    _ATLTRY
    {
        m_rgRowData.Add(trData);
    }
    _ATLCATCHALL()
    {
        return E_OUTOFMEMORY;
    }
    //if (!m_rgRowData.Add(trData))
    //    return E_OUTOFMEMORY;
    *pcRowsAffected = 1;
    return S_OK;
}

GetDBStatus Funkcja jest bardzo ważne dla prawidłowego funkcjonowania wierszy schematu.Ponieważ nie zwraca danych każdej kolumny w tabel zestawu wierszy, należy określić, które kolumny zwracane dane, które nie.

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;
    }
}

Ponieważ Twoje Execute funkcja zwraca wartość danych dla nazwa_tabeli, TABLE_TYPE, i Opis pola z tabel zestawu wierszy, można Szukaj w dodatku b specyfikacji OLE DB i określić (licząc od góry w dół) są liczby porządkowe, 3, 4 i 6.Dla każdej z tych kolumn, DBSTATUS_S_OK.Dla wszystkich innych kolumn, DBSTATUS_S_ISNULL.Jest ważne, aby ten stan zwrotu, ponieważ konsument może nie zrozumieć, że wartość powrocie jest NULL lub coś jeszcze.Ponownie, należy zauważyć, że NULL nie jest równy pusta.

Aby uzyskać więcej informacji dotyczących interfejsu OLE DB schematu zestawu wierszy, zobacz IDBSchemaRowset interfejsu OLE DB Programmer's Reference.

Aby uzyskać informacje dotyczące użycia konsumentów IDBSchemaRowset metod, zobacz Uzyskania metadanych z zestawów wierszy schematu.

Przykładem jest dostawca obsługujący zestawów wierszy schematu, zobacz UpdatePV próbki.

Zobacz też

Koncepcje

Zaawansowane techniki dostawcy