Elementy członkowskie dotyczące stanu pola w metodach dostępu generowanych przez kreatoraField Status Data Members in Wizard-Generated Accessors

Kreator użytkownika ATL OLE DB nie jest dostępny w programie Visual Studio 2019 i nowszych.The ATL OLE DB Consumer wizard is not available in Visual Studio 2019 and later. Można nadal ręcznie dodawać funkcje.You can still add the functionality manually. Aby uzyskać więcej informacji, zobacz Tworzenie klienta bez korzystania z Kreatora.For more information, see Creating a Consumer Without Using a Wizard.

W przypadku utworzenia konsumenta przy użyciu kreatora ATL OLE DB User, Kreator generuje element członkowski danych w klasie rekordu użytkownika dla każdego pola określonego w mapie kolumn.When you use the ATL OLE DB Consumer Wizard to create a consumer, the wizard generates a data member in the user record class for each field that you specify in your column map. Każdy element członkowski danych jest typu DWORD i zawiera wartość stanu odpowiadającą jej odpowiedniemu polu.Each data member is of type DWORD and contains a status value corresponding to its respective field.

Na przykład dla elementu członkowskiego danych m_OwnerID Kreator generuje dodatkowy element członkowski danych dla stanu pola (dwOwnerIDStatus), a drugi dla długości pola (dwOwnerIDLength).For example, for a data member m_OwnerID, the wizard generates an additional data member for field status (dwOwnerIDStatus) and another one for field length (dwOwnerIDLength). Generuje również mapę kolumn zawierającą COLUMN_ENTRY_LENGTH_STATUS wpisów.It also generates a column map with COLUMN_ENTRY_LENGTH_STATUS entries.

Jest to pokazane w poniższym kodzie:This is shown in the following code:

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

W przypadku modyfikacji klasy rekordu użytkownika lub napisania własnego odbiorcy zmienne danych muszą występować przed zmiennymi stan i długość.If you modify the user record class or write your own consumer, the data variables must come before the status and length variables.

Wartości stanu można użyć do celów debugowania.You can use the status values for debugging purposes. Jeśli kod wygenerowany przez kreatora ATL OLE DB użytkownika generuje błędy kompilacji, takie jak DB_S_ERRORSOCCURRED lub DB_E_ERRORSOCCURRED, należy najpierw przejrzeć bieżące wartości elementów członkowskich danych stanu pola.If code generated by the ATL OLE DB Consumer Wizard generates compilation errors such as DB_S_ERRORSOCCURRED or DB_E_ERRORSOCCURRED, you should first look at the current values of the field status data members. Te, które mają wartość różną od zera, odpowiadają kolumnom, które są nieprawidłowe.Those that have nonzero values correspond to the offending columns.

Można również użyć wartości stanu, aby ustawić wartość NULL dla określonego pola.You can also use the status values to set a NULL value for a particular field. Dzięki temu można w przypadkach, w których chcesz odróżnić wartość pola jako wartość NULL, a nie zero.Doing so helps you in cases in which you want to distinguish a field value as NULL rather than zero. Istnieje możliwość określenia, czy wartość NULL jest prawidłowa, czy wartość specjalna i decyduje o tym, jak aplikacja powinna ją obsłużyć.It is up to you to decide whether NULL is a valid value or a special value and decide how your application should handle it. OLE DB definiuje DBSTATUS_S_ISNULL jako poprawna Metoda określania ogólnej wartości NULL.OLE DB defines DBSTATUS_S_ISNULL as the correct means of specifying a generic NULL value. Jeśli konsument odczytuje dane, a wartość jest równa null, pole stanu ma wartość DBSTATUS_S_ISNULL.If the consumer reads data and the value is null, the status field is set to DBSTATUS_S_ISNULL. Jeśli odbiorca chce ustawić wartość NULL, konsument ustawi wartość stanu na DBSTATUS_S_ISNULL przed wywołaniem dostawcy.If the consumer wants to set a NULL value, the consumer sets the status value to DBSTATUS_S_ISNULL before calling the provider.

Następnie otwórz OLEDB. h i wyszukaj ciąg DBSTATUSENUM.Next, open Oledb.h and search for DBSTATUSENUM. Następnie można dopasować wartość numeryczną stanu niezerowego do wartości wyliczenia DBSTATUSENUM.You can then match the numerical value of the nonzero status against the DBSTATUSENUM enumeration values. Jeśli nazwa wyliczenia nie jest wystarczająca do poinformowania o błędach, zobacz temat stan w sekcji wartości danych powiązania w przewodniku OLE DB programisty.If the enumeration name is not sufficient to tell you what is wrong, see the Status topic in the Binding Data Values section of the OLE DB Programmer's Guide. Ten temat zawiera tabele wartości stanu używanych podczas pobierania lub ustawiania danych.This topic contains tables of status values used when getting or setting data. Aby uzyskać informacje na temat długości wartości, zobacz temat Długość w tej samej sekcji.For information about length values, see the Length topic in the same section.

Pobieranie długości lub stanu kolumnyRetrieving the Length or Status of a Column

Można pobrać długość kolumny o zmiennej długości lub stanu kolumny (na przykład w celu sprawdzenia, czy DBSTATUS_S_ISNULL):You can retrieve the length of a variable-length column or the status of a column (to check for DBSTATUS_S_ISNULL, for example):

  • Aby uzyskać długość, użyj makra COLUMN_ENTRY_LENGTH.To get the length, use the COLUMN_ENTRY_LENGTH macro.

  • Aby uzyskać stan, użyj makra COLUMN_ENTRY_STATUS.To get the status, use the COLUMN_ENTRY_STATUS macro.

  • Aby skorzystać z obu tych metod, użyj COLUMN_ENTRY_LENGTH_STATUS, jak pokazano poniżej:To get both, use COLUMN_ENTRY_LENGTH_STATUS, as shown:

    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 podanej długości i/lub stanu:Then, access the length and/or status as shown:

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

Gdy używasz CDynamicAccessor , długość i stan są powiązane automatycznie.When you use CDynamicAccessor, the length and status are bound for you automatically. Aby pobrać wartości długości i stanu, użyj GetLength GetStatus funkcji i.To retrieve the length and status values, use the GetLength and GetStatus member functions.

Zobacz teżSee also

Praca z szablonami konsumentów OLE DBWorking with OLE DB Consumer Templates