Udostępnij za pośrednictwem


Elementy członkowskie dotyczące stanu pola w metodach dostępu generowanych przez kreatora

Kreator konsumenta OLE DB ATL nie jest dostępny w programie Visual Studio 2019 i nowszych wersjach. Nadal można dodać funkcjonalność ręcznie. Aby uzyskać więcej informacji, zobacz Tworzenie konsumenta bez korzystania z Kreatora.

Gdy do utworzenia użytkownika jest używany Kreator konsumenta OLE DB ATL, kreator generuje składową danych w klasie rekordów użytkownika dla każdego pola określonego na mapie kolumn. Każdy element członkowski danych jest typu DWORD i zawiera wartość stanu odpowiadającą odpowiedniemu polu.

Na przykład w przypadku m_OwnerID elementu członkowskiego danych kreator generuje dodatkowy element członkowski danych dla stanu pola (dwOwnerIDStatus) i drugi dla długości pola (dwOwnerIDLength). Generuje również mapę kolumn z wpisami COLUMN_ENTRY_LENGTH_STATUS.

Jest to pokazane w następującym kodzie:

class CAuthorsAccessor
{
public:
   LONG m_AuID;
   TCHAR m_Author[53];
   LONG m_YearBorn;

   DBSTATUS m_dwAuIDStatus;
   DBSTATUS m_dwAuthorStatus;
   DBSTATUS m_dwYearBornStatus;

   DBLENGTH m_dwAuIDLength;
   DBLENGTH m_dwAuthorLength;
   DBLENGTH m_dwYearBornLength;

   DEFINE_COMMAND_EX(CAuthorsAccessor, L" \
   SELECT \
      AuID, \
      Author, \
      YearBorn \
      FROM dbo.Authors")

   BEGIN_COLUMN_MAP(CAuthorsAccessor)
      COLUMN_ENTRY_LENGTH_STATUS(1, m_AuID, dwAuIDLength, dwAuIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(2, m_Author, dwAuthorLength, dwAuthorStatus)
      COLUMN_ENTRY_LENGTH_STATUS(3, m_YearBorn, dwYearBornLength, dwYearBornStatus)
   END_COLUMN_MAP()
...

Uwaga

Jeśli zmodyfikujesz klasę rekordów użytkownika lub zapiszesz własnego konsumenta, zmienne danych muszą znajdować się przed zmiennymi stanu i długości.

Wartości stanu można używać do celów debugowania. Jeśli kod wygenerowany przez Kreatora konsumenta OLE DB ATL generuje błędy kompilacji, takie jak DB_S_ERRORSOCCURRED lub DB_E_ERRORSOCCURRED, należy najpierw przyjrzeć się bieżącym wartościom elementów członkowskich danych stanu pola. Te, które mają wartości inne niżzerowe, odpowiadają obraźliwym kolumnom.

Możesz również użyć wartości stanu, aby ustawić wartość NULL dla określonego pola. Ułatwia to w przypadkach, w których chcesz odróżnić wartość pola jako null, a nie zero. Należy zdecydować, czy wartość NULL jest prawidłową wartością, czy specjalną wartością, i zdecydować, jak aplikacja powinna ją obsługiwać. Ole DB definiuje DBSTATUS_S_ISNULL jako poprawne metody określania ogólnej wartości NULL. Jeśli odbiorca odczytuje dane i wartość ma wartość null, pole stanu jest ustawione na DBSTATUS_S_ISNULL. Jeśli użytkownik chce ustawić wartość NULL, użytkownik ustawia wartość stanu na DBSTATUS_S_ISNULL przed wywołaniem dostawcy.

Następnie otwórz plik Oledb.h i wyszukaj ciąg DBSTATUSENUM. Następnie można dopasować wartość liczbową stanu niezerowego do wartości wyliczenia DBSTATUSENUM. Jeśli nazwa wyliczenia nie jest wystarczająca, aby poinformować, co jest złe, zobacz temat Status (Stan) w sekcji Binding Data Values (Wartości danych powiązania) w przewodniku programisty OLE DB. Ten temat zawiera tabele wartości stanu używanych podczas pobierania lub ustawiania danych. Aby uzyskać informacje o wartościach długości, zobacz temat Długość w tej samej sekcji.

Pobieranie długości lub stanu kolumny

Możesz pobrać długość kolumny o zmiennej długości lub stan kolumny (na przykład w celu sprawdzenia DBSTATUS_S_ISNULL):

  • Aby uzyskać długość, użyj makra COLUMN_ENTRY_LENGTH.

  • Aby uzyskać stan, użyj makra COLUMN_ENTRY_STATUS.

  • Aby uzyskać oba te elementy, użyj COLUMN_ENTRY_LENGTH_STATUS, jak pokazano poniżej:

    class CProducts
    {
    public:
       char      szName[40];
       long      nNameLength;
       DBSTATUS   nNameStatus;
    
    BEGIN_COLUMN_MAP(CProducts)
    // Bind the column to CProducts.m_ProductName.
    // nOrdinal is zero-based, so the column number of m_ProductName is 1.
       COLUMN_ENTRY_LENGTH_STATUS(1, szName, nNameLength, nNameStatus)
    END_COLUMN_MAP()
    };
    
  • Następnie uzyskaj dostęp do długości i/lub stanu, jak pokazano poniżej:

    CTable<CAccessor<CProducts >> product;
    CSession session;
    
    product.Open(session, "Product");
    
    while (product.MoveNext() == S_OK)
    {
       // Check the product name isn't NULL before tracing it
       if (product.nNameStatus == DBSTATUS_S_OK)
          ATLTRACE("%s is %d characters\n", product.szName, product.nNameLength);
    }
    

W przypadku użycia CDynamicAccessorparametru długość i stan są automatycznie powiązane. Aby pobrać wartości długości i stanu, użyj funkcji składowych GetLength i GetStatus .

Zobacz też

Praca z szablonami konsumentów OLE DB