Obsługa zestawów wierszy schematuSupporting Schema Rowsets

Zestawy wierszy schematu umożliwiają klientom pobieranie informacji o magazynie danych bez znajomości podstawowej struktury lub schematu.Schema rowsets allow consumers to get information about a data store without knowing its underlying structure, or schema. Na przykład magazyn danych może mieć tabele zorganizowane w hierarchię zdefiniowaną przez użytkownika, więc nie ma możliwości zapewnienia znajomości schematu, z wyjątkiem odczytywania go.For example, a data store might have tables organized into a user-defined hierarchy, so there would be no way to ensure knowledge of the schema except by reading it. (W innym przykładzie kreatory Visual C++ używają zestawów wierszy schematu do generowania metod dostępu dla konsumenta). Aby umożliwić konsumentowi wykonanie tej czynności, obiekt sesji dostawcy ujawnia metody w interfejsie IDBSchemaRowset .(As another example, the Visual C++ wizards use schema rowsets to generate accessors for the consumer.) To allow the consumer to do this, the provider's session object exposes methods on the IDBSchemaRowset interface. W Visual C++ aplikacji należy użyć klasy IDBSchemaRowsetImpl do zaimplementowania IDBSchemaRowset .In Visual C++ applications, you use the IDBSchemaRowsetImpl class to implement IDBSchemaRowset.

IDBSchemaRowsetImpl obsługuje następujące metody:IDBSchemaRowsetImpl supports the following methods:

  • CheckRestrictions sprawdza ważność ograniczeń względem zestawu wierszy schematu.CheckRestrictions checks the validity of restrictions against a schema rowset.

  • CreateSchemaRowset implementuje funkcję twórcy obiektów COM dla obiektu określonego przez parametr szablonu.CreateSchemaRowset implements a COM object creator function for the object specified by the template parameter.

  • Setograniczenia określa, które ograniczenia są obsługiwane dla określonego zestawu wierszy schematu.SetRestrictions specifies which restrictions you support on a particular schema rowset.

  • IDBSchemaRowset:: GetRowset zwraca zestaw wierszy schematu (Dziedziczony z interfejsu).IDBSchemaRowset::GetRowset returns a schema rowset (inherited from interface).

  • GetSchemas zwraca listę zestawów wierszy schematu dostępnych przez program IDBSchemaRowsetImpl::GetRowset (Dziedziczony z interfejsu).GetSchemas returns a list of schema rowsets accessible by IDBSchemaRowsetImpl::GetRowset (inherited from interface).

Obsługa kreatora dostawcy OLE DB ATLATL OLE DB Provider Wizard Support

Kreator dostawcy OLE DB ATL nie jest dostępny w programie Visual Studio 2019 i nowszych.The ATL OLE DB Provider wizard is not available in Visual Studio 2019 and later.

Kreator dostawcy OLE DB ATL tworzy trzy klasy schematu w pliku nagłówkowym sesji:The ATL OLE DB Provider Wizard creates three schema classes in the session header file:

  • CShortNameSessionTRSchemaRowsetCShortNameSessionTRSchemaRowset

  • CShortNameSessionColSchemaRowsetCShortNameSessionColSchemaRowset

  • CShortNameSessionPTSchemaRowsetCShortNameSessionPTSchemaRowset

Te klasy odpowiadają na żądania klientów dotyczące informacji o schemacie; Należy zauważyć, że Specyfikacja OLE DB wymaga, aby te trzy zestawy wierszy schematu były obsługiwane:These classes respond to consumer requests for schema information; note that the OLE DB specification requires that these three schema rowsets be supported:

  • CShortNameSessionTRSchemaRowset obsługuje żądania dla informacji tabeli (zestaw wierszy schematu DBSCHEMA_TABLES).CShortNameSessionTRSchemaRowset handles requests for table information (the DBSCHEMA_TABLES schema rowset).

  • CShortNameSessionColSchemaRowset obsługuje żądania informacji o kolumnie (zestaw wierszy schematu DBSCHEMA_COLUMNS).CShortNameSessionColSchemaRowset handles requests for column information (the DBSCHEMA_COLUMNS schema rowset). Kreator dostarcza przykładowe implementacje dla tych klas, które zwracają informacje o schemacie dla dostawcy systemu DOS.The wizard supplies sample implementations for these classes, which return schema information for a DOS provider.

  • CShortNameSessionPTSchemaRowset obsługuje żądania informacji o schemacie dotyczące typu dostawcy (zestaw wierszy schematu DBSCHEMA_PROVIDER_TYPES).CShortNameSessionPTSchemaRowset handles requests for schema information about the provider type (the DBSCHEMA_PROVIDER_TYPES schema rowset). Domyślna implementacja udostępniona przez kreatora zwraca S_OK.The default implementation provided by the wizard returns S_OK.

Można dostosować te klasy do obsługi informacji o schemacie odpowiednich dla dostawcy:You can customize these classes to handle schema information appropriate to your provider:

  • W języku CShortNameSessionTRSchemaRowset należy wypełnić pola wykazu, tabeli i opisu ( trData.m_szType , trData.m_szTable i trData.m_szDesc ).In CShortNameSessionTRSchemaRowset, you must fill out the catalog, table, and description fields (trData.m_szType, trData.m_szTable, and trData.m_szDesc). W przykładzie wygenerowanym przez kreatora jest wykorzystywany tylko jeden wiersz (tabela).The wizard-generated example uses only one row (table). Inni dostawcy mogą zwrócić więcej niż jedną tabelę.Other providers might return more than one table.

  • W CShortNameSessionColSchemaRowset, należy przekazać nazwę tabeli jako DBID .In CShortNameSessionColSchemaRowset, you pass the name of the table as a DBID.

Ustawienia ograniczeńSetting Restrictions

Ważnym pojęciem obsługi zestawu wierszy schematu jest ustawienie ograniczeń, które są używane SetRestrictions .An important concept in schema rowset support is setting restrictions, which you do using SetRestrictions. Ograniczenia umożliwiają konsumentom pobieranie tylko pasujących wierszy (na przykład Znajdź wszystkie kolumny w tabeli "MyTable").Restrictions allow consumers to fetch only matching rows (for example, find all the columns in the table "MyTable"). Ograniczenia są opcjonalne i w przypadku, gdy żaden z nich nie jest obsługiwany (wartość domyślna), wszystkie dane są zawsze zwracane.Restrictions are optional, and in the case in which none are supported (the default), all data is always returned. Aby zapoznać się z przykładem dostawcy, który obsługuje ograniczenia, zobacz przykład UpdatePV .For an example of a provider that does support restrictions, see the UpdatePV sample.

Konfigurowanie mapy schematówSetting up the Schema Map

Skonfiguruj mapę schematu, taką jak ta, w sesji Session. h w UpdatePV:Set up a schema map such as this one in Session.h in UpdatePV:

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

Aby obsługiwać IDBSchemaRowset , musisz obsługiwać DBSCHEMA_TABLES, DBSCHEMA_COLUMNS i DBSCHEMA_PROVIDER_TYPES.To support IDBSchemaRowset, you must support DBSCHEMA_TABLES, DBSCHEMA_COLUMNS, and DBSCHEMA_PROVIDER_TYPES. Możesz dodać dodatkowe zestawy wierszy schematu według własnego uznania.You can add additional schema rowsets at your discretion.

Zadeklaruj klasę zestawu wierszy schematu za pomocą Execute metody, takiej jak CUpdateSessionTRSchemaRowset w UpdatePV :Declare a schema rowset class with an Execute method such as CUpdateSessionTRSchemaRowset in 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)

CUpdateSession dziedziczy po IDBSchemaRowsetImpl , więc ma wszystkie metody obsługi ograniczeń.CUpdateSession inherits from IDBSchemaRowsetImpl, so it has all the restriction handling methods. Przy użyciu CSchemaRowsetImpl , deklaruj trzy klasy podrzędne (wymienione w mapowaniu schematu powyżej): CUpdateSessionTRSchemaRowset , CUpdateSessionColSchemaRowset , i CUpdateSessionPTSchemaRowset .Using CSchemaRowsetImpl, declare three child classes (listed in the schema map above): CUpdateSessionTRSchemaRowset, CUpdateSessionColSchemaRowset, and CUpdateSessionPTSchemaRowset. Każda z tych klas podrzędnych ma Execute metodę, która obsługuje odpowiedni zestaw ograniczeń (kryteria wyszukiwania).Each of these child classes has an Execute method that handles its respective set of restrictions (search criteria). Każda Execute Metoda porównuje wartości parametrów cRestrictions i rgRestrictions .Each Execute method compares the values of the cRestrictions and rgRestrictions parameters. Zobacz opis tych parametrów w temacie setograniczenia.See the description of these parameters in SetRestrictions.

Aby uzyskać więcej informacji o ograniczeniach odnoszących się do określonego zestawu wierszy schematu, zobacz tabelę identyfikatorów GUID zestawu wierszy w IDBSchemaRowset w dokumentacji programisty OLE DB w Windows SDK.For more information about which restrictions correspond to a particular schema rowset, see the table of schema rowset GUIDs in IDBSchemaRowset in the OLE DB Programmer's Reference in the Windows SDK.

Na przykład jeśli na DBSCHEMA_TABLES jest obsługiwane ograniczenie TABLE_NAME, należy wykonać następujące czynności:For example, if you supported the TABLE_NAME restriction on DBSCHEMA_TABLES, you would do the following:

Najpierw Znajdź DBSCHEMA_TABLES i sprawdź, czy obsługuje cztery ograniczenia (w kolejności).First, look up DBSCHEMA_TABLES and see that it supports four restrictions (in order).

Ograniczenie zestawu wierszy schematuSchema rowset restriction Wartość ograniczeniaRestriction value
TABLE_CATALOGTABLE_CATALOG 0x1 (dane binarne 1)0x1 (binary 1)
TABLE_SCHEMATABLE_SCHEMA 0x2 (binarny 10)0x2 (binary 10)
TABLE_NAMETABLE_NAME 0x4 (binarny 100)0x4 (binary 100)
TABLE_TYPETABLE_TYPE 0x8 (binarny 1000)0x8 (binary 1000)

Następnie dla każdego ograniczenia istnieje jeden bit.Next, there's one bit for each restriction. Ponieważ chcesz obsługiwać tylko TABLE_NAME, zwróć wartość 0x4 w rgRestrictions elemencie.Because you want to support TABLE_NAME only, you would return 0x4 in the rgRestrictions element. Jeśli obsługiwane są TABLE_CATALOG i TABLE_NAME, należy zwrócić 0x5 (binarny 101).If you supported TABLE_CATALOG and TABLE_NAME, you would return 0x5 (binary 101).

Domyślnie implementacja zwraca wartość 0 (nie obsługuje żadnych ograniczeń) dla każdego żądania.By default, the implementation returns 0 (doesn't support any restrictions) for any request. UpdatePV jest przykładem dostawcy, który obsługuje ograniczenia.UpdatePV is an example of a provider that does support restrictions.

PrzykładExample

Ten kod jest pobierany z przykładu UpdatePV .This code is taken from the UpdatePV sample. UpdatePv obsługuje trzy wymagane zestawy wierszy schematu: DBSCHEMA_TABLES, DBSCHEMA_COLUMNS i DBSCHEMA_PROVIDER_TYPES.UpdatePv supports the three required schema rowsets: DBSCHEMA_TABLES, DBSCHEMA_COLUMNS, and DBSCHEMA_PROVIDER_TYPES. Przykładowo, jak zaimplementować obsługę schematu w ramach dostawcy, ten temat przeprowadzi Cię przez proces wdrażania zestawu wierszy DBSCHEMA_TABLE.As an example of how to implement schema support in your provider, this topic takes you through implementing the DBSCHEMA_TABLE rowset.

Uwaga

Przykładowy kod może się różnić od tego, co jest wymienione tutaj; przykładowy kod należy traktować jako nowszą wersję.The sample code might differ from what is listed here; you should regard the sample code as the more up-to-date version.

Pierwszym krokiem dodawania obsługi schematu jest określenie ograniczeń, które mają być obsługiwane.The first step in adding schema support is to determine which restrictions you're going to support. Aby określić, które ograniczenia są dostępne dla zestawu wierszy schematu, zapoznaj się ze specyfikacją OLE DBą dla definicji IDBSchemaRowset .To determine which restrictions are available for your schema rowset, look at the OLE DB specification for the definition of IDBSchemaRowset. Zgodnie z definicją główną można wyświetlić tabelę zawierającą nazwę zestawu wierszy schematu, liczbę ograniczeń i kolumny ograniczeń.Following the main definition, you see a table holding the schema rowset name, the number of restrictions, and the restriction columns. Wybierz zestaw wierszy schematu, który ma być obsługiwany, i zanotuj liczbę ograniczeń i kolumn ograniczeń.Select the schema rowset you want to support and make a note of the number of restrictions and restriction columns. Na przykład DBSCHEMA_TABLES obsługuje cztery ograniczenia (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME i TABLE_TYPE):For example, DBSCHEMA_TABLES supports four restrictions (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, and 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żdą kolumnę ograniczenia.A bit represents each restriction column. Jeśli chcesz obsłużyć ograniczenie (to oznacza, możesz wykonać zapytania według niego), ustaw ten bit na 1.If you want to support a restriction (that is, you can query by it), set that bit to a 1. Jeśli nie chcesz obsłużyć ograniczenia, ustaw ten bit na zero.If you don't want to support a restriction, set that bit to zero. W wierszu kodu powyżej program UpdatePV obsługuje ograniczenia TABLE_NAME i TABLE_TYPE w zestawie wierszy DBSCHEMA_TABLES.From the line of code above, UpdatePV supports the TABLE_NAME and TABLE_TYPE restrictions on the DBSCHEMA_TABLES rowset. Są to trzy ograniczenia (Maska bitowa 100) i czwarta (Maska bitów 1000).These are the third (bit mask 100) and fourth (bit mask 1000) restrictions. W związku z tym maska bitów dla UpdatePv jest 1100 (lub 0x0c):Therefore, the bitmask for UpdatePv is 1100 (or 0x0C):

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

Następująca Execute Funkcja jest podobna do tych w zwykłych zestawach wierszy.The following Execute function is similar to those in regular rowsets. Masz trzy argumenty: pcRowsAffected, cRestrictions i rgRestrictions.You have three arguments: pcRowsAffected, cRestrictions, and rgRestrictions. Zmienna pcRowsAffected jest parametrem wyjściowym, który dostawca może zwrócić liczbę wierszy w zestawie wierszy schematu.The pcRowsAffected variable is an output parameter that the provider can return the count of rows in the schema rowset. Parametr cRestrictions jest parametrem wejściowym zawierającym liczbę ograniczeń przekazaną przez odbiorcę do dostawcy.The cRestrictions parameter is an input parameter holding the number of restrictions passed by the consumer to the provider. Parametr rgRestrictions jest tablicą wartości wariantów, które zawierają wartości ograniczeń.The rgRestrictions parameter is an array of VARIANT values that hold the restriction values.

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

Zmienna cRestrictions jest oparta na łącznej liczbie ograniczeń zestawu wierszy schematu, niezależnie od tego, czy dostawca je obsługuje.The cRestrictions variable is based on the total number of restrictions for a schema rowset, regardless of whether the provider supports them. Ponieważ UpdatePv obsługuje dwa ograniczenia (trzecia i czwarta), ten kod szuka tylko wartości cRestrictions większej lub równej 3.Because UpdatePv supports two restrictions (the third and fourth), this code only looks for a cRestrictions value greater than or equal to three.

Wartość ograniczenia TABLE_NAME jest przechowywana w rgRestrictions [2] (ponowne ograniczenie w tablicy opartej na zero to 2).The value for the TABLE_NAME restriction is stored in rgRestrictions[2] (again, the third restriction in a zero-based array is 2). Sprawdź, czy ograniczenie nie jest VT_EMPTY, aby było w rzeczywistości obsługiwane.Check that the restriction isn't VT_EMPTY to actually support it. Należy pamiętać, że VT_NULL nie jest równe VT_EMPTY.Note that VT_NULL isn't equal to VT_EMPTY. VT_NULL określa prawidłową wartość ograniczenia.VT_NULL specifies a valid restriction value.

UpdatePvDefinicja nazwy tabeli jest w pełni kwalifikowaną nazwą ścieżki do pliku tekstowego.The UpdatePv definition of a table name is a fully qualified path name to a text file. Wyodrębnij wartość ograniczenia, a następnie spróbuj otworzyć plik, aby upewnić się, że plik rzeczywiście istnieje.Extract the restriction value and then try to open the file to ensure that the file does actually exist. Jeśli plik nie istnieje, zwróć S_OK.If the file doesn't exist, return S_OK. Może się wydawać, że jest to bit do tyłu, ale kod jest naprawdę informujący użytkownika, że nie ma żadnych obsługiwanych tabel o określonej nazwie.This might seem a bit backwards but what the code is really telling the consumer is that there were no supported tables by the name specified. S_OK Return oznacza, że kod wykonywany prawidłowo.The S_OK return means that the code executed correctly.

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

Obsługa czwartego ograniczenia (TABLE_TYPE) jest podobna do trzeciego ograniczenia.Supporting the fourth restriction (TABLE_TYPE) is similar to the third restriction. Sprawdź, czy wartość nie jest VT_EMPTY.Check to see that the value isn't VT_EMPTY. To ograniczenie zwraca tylko typ tabeli, tabelę.This restriction only returns the table type, TABLE. Aby określić prawidłowe wartości dla DBSCHEMA_TABLES, zapoznaj się z sekcją B odwołania OLE DB programisty w tabeli zestawów wierszy.To determine the valid values for the DBSCHEMA_TABLES, look in Appendix B of the OLE DB Programmer's Reference in the TABLES rowset section.

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

W tym miejscu jest tworzony wpis wiersza dla zestawu wierszy.This is where you actually create a row entry for the rowset. Zmienna trData odpowiada CTABLESRow strukturze zdefiniowanej w szablonach dostawcy OLE DB.The variable trData corresponds to CTABLESRow, a structure defined in the OLE DB provider templates. CTABLESRow odpowiada definicji zestawu wierszy tabel w dodatku B specyfikacji OLE DB.CTABLESRow corresponds to the TABLES rowset definition in Appendix B of the OLE DB specification. Masz tylko jeden wiersz do dodania, ponieważ w danym momencie można obsługiwać tylko jedną tabelę.You only have one row to add because you can only support one table at a time.

// 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: TABLE_NAME, TABLE_TYPE i opis.UpdatePV sets only three columns: TABLE_NAME, TABLE_TYPE, and DESCRIPTION. Zanotuj kolumny, dla których są zwracane informacje, ponieważ te informacje są potrzebne podczas implementacji GetDBStatus :Make a note of the columns for which you return information, because you need this information when you implement GetDBStatus:

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

GetDBStatusFunkcja jest ważna dla poprawnej operacji zestawu wierszy schematu.The GetDBStatus function is important to the correct operation of the schema rowset. Ponieważ nie są zwracane żadne dane dla każdej kolumny w zestawie wierszy, należy określić kolumny, dla których dane są zwracane, a które nie.Because you don't return data for every column in the TABLES rowset, you need to specify which columns you return data for and which you do not.

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ż Execute Funkcja zwraca dane dla pól table_name, TABLE_TYPE i Description z zestawu wierszy tabel, można zajrzeć do dodatku B specyfikacji OLE DB i określić (poprzez zliczanie od góry), że są to liczby porządkowe 3, 4 i 6.Because your Execute function returns data for the TABLE_NAME, TABLE_TYPE, and DESCRIPTION fields from the TABLES rowset, you can look in Appendix B of the OLE DB specification and determine (by counting from the top down) that they're ordinals 3, 4, and 6. Dla każdej z tych kolumn zwraca DBSTATUS_S_OK.For each of those columns, return DBSTATUS_S_OK. Dla wszystkich innych kolumn zwraca DBSTATUS_S_ISNULL.For all the other columns, return DBSTATUS_S_ISNULL. Ważne jest, aby zwrócić ten stan, ponieważ konsument może nie rozumieć, że zwracana wartość ma wartość NULL lub coś innego.It's important to return this status, because a consumer might not understand that the value you return is NULL or something else. Należy pamiętać, że wartość NULL nie jest równoznaczna z wartością pustą.Again, note that NULL isn't equivalent to empty.

Aby uzyskać więcej informacji na temat interfejsu zestawu wierszy schematu OLE DB, zobacz Interfejs IDBSchemaRowset w dokumentacji OLE DB programisty.For more information about the OLE DB schema rowset interface, see the IDBSchemaRowset interface in the OLE DB Programmer's Reference.

Aby uzyskać informacje o sposobach używania IDBSchemaRowset metod przez odbiorców, zobacz Uzyskiwanie metadanych z zestawami wierszy schematu.For information about how consumers can use IDBSchemaRowset methods, see Obtaining Metadata with Schema Rowsets.

Aby zapoznać się z przykładem dostawcy, który obsługuje zestawy wierszy schematu, zobacz przykład UpdatePV .For an example of a provider that supports schema rowsets, see the UpdatePV sample.

Zobacz teżSee also

Zaawansowane techniki dostawcyAdvanced Provider Techniques