在精靈產生的存取子中的欄位狀態資料成員

Visual Studio 2019 及更新版本中未提供 ATL OLE DB 消費者精靈。 您仍能手動新增功能。 如需詳細資訊,請參閱未使用精靈建立消費者

當您使用 ATL OLE DB 消費者精靈來建立消費者時,精靈會針對您在資料行對應中指定的每個欄位,於使用者記錄類別中產生資料成員。 每個資料成員的型別均為 DWORD,並包含對應至其個別欄位的狀態值。

例如,針對資料成員 m_OwnerID,精靈會為欄位狀態產生一個額外的資料成員 (dwOwnerIDStatus),並為欄位長度產生另一個成員 (dwOwnerIDLength)。 它也會產生含 COLUMN_ENTRY_LENGTH_STATUS 項目的資料行對應。

這會以下列程式碼顯示:

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()
...

注意

如果您修改使用者記錄類別或撰寫自己的消費者,資料變數必須出現在狀態和長度變數之前。

您可以基於偵錯目的來使用狀態值。 如果 ATL OLE DB 消費者精靈所產生的程式碼會產生編譯錯誤 (例如 DB_S_ERRORSOCCURRED 或 DB_E_ERRORSOCCURRED),您應該先查看欄位狀態資料成員的目前值。 那些具有非零值的成員會對應至衝突的資料行。

您也可以使用狀態值來設定特定欄位的 NULL 值。 如果您想要將欄位值區分為 NULL 而非零,這樣做可為您提供協助。 您必須自行決定 NULL 是否為有效值或特殊值,並決定應用程式應該如何處理它。 OLE DB 會定義 DBSTATUS_S_ISNULL 作為指定泛型 NULL 值的正確方法。 如果消費者讀取資料且值為 Null,就會將狀態欄位設定為 DBSTATUS_S_ISNULL。 如果消費者想要設定 NULL 值,則消費者會先將狀態值設定為 DBSTATUS_S_ISNULL,然後再呼叫提供者。

接下來,開啟 Oledb.h 並搜尋 DBSTATUSENUM。 您接著可以針對 DBSTATUSENUM 列舉值來比對非零狀態的數值。 如果列舉名稱不足以告訴您哪裡有錯誤,請參閱 OLE DB 程式設計人員指南繫結資料值一節的狀態主題。 本主題包含在取得或設定資料時所使用的狀態值表格。 如需長度值的相關資訊,請參閱同一節中的長度主題。

擷取資料行的長度或狀態

您可以擷取可變長度資料行的長度或資料行的狀態 (例如,檢查 DBSTATUS_S_ISNULL):

  • 若要取得長度,使用 COLUMN_ENTRY_LENGTH 巨集。

  • 若要取得狀態,使用 COLUMN_ENTRY_STATUS 巨集。

  • 若要取得這兩者,使用 COLUMN_ENTRY_LENGTH_STATUS,如同所示:

    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()
    };
    
  • 然後,存取長度和/或狀態,如同所示:

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

當您使用 CDynamicAccessor 時,即會自動繫結長度和狀態。 若要擷取長度和狀態值,使用 GetLengthGetStatus 成員函式。

另請參閱

使用 OLE DB 消費者範本