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

Korzystając z biblioteki ATL OLE DB konsumenta kreatora do utworzenia konsumenta, Kreator generuje członek danych w klasie rekordu użytkownika dla każdego pola określonego w kolumnie mapę.Każdy członek danych jest typu DWORD i zawiera wartość status odpowiadające jej odpowiednie pole.

Na przykład dla członka danych m_OwnerID, Kreator generuje członka dodatkowe dane dla pola stanu (dwOwnerIDStatus), a drugi dla długości pola (dwOwnerIDLength).Również generuje mapę kolumny z COLUMN_ENTRY_LENGTH_STATUS wpisów.

Jest to zademonstrowane w poniższym kodzie:

[db_source("insert connection string")]
[db_command(" \
   SELECT \
      Au_ID, \
      Author, \
      `Year Born`, \
      FROM Authors")]

class CAuthors
{
public:

   // The following wizard-generated data members contain status 
   // values for the corresponding fields in the column map. You 
   // can use these values to hold NULL values that the database 
   // returns or to hold error information when the compiler returns 
   // errors. See "Field Status Data Members in Wizard-Generated 
   // Accessors" in the Visual C++ documentation for more information 
   // on using these fields.
   DWORD m_dwAuIDStatus;
   DWORD m_dwAuthorStatus;
   DWORD m_dwYearBornStatus;

   // The following wizard-generated data members contain length
   // values for the corresponding fields in the column map.
   DWORD m_dwAuIDLength;
   DWORD m_dwAuthorLength;
   DWORD m_dwYearBornLength;

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

   [ db_column(1, status=m_dwAuIDStatus, length=m_dwAuIDLength) ] LONG m_AuID;
   [ db_column(2, status=m_dwAuthorStatus, length=m_dwAuthorLength) ] TCHAR m_Author[51];
   [ db_column(3, status=m_dwYearBornStatus, length=m_dwYearBornLength) ] SHORT m_YearBorn;

   void GetRowsetProperties(CDBPropSet* pPropSet)
   {
      pPropSet->AddProperty(DBPROP_IRowsetChange, true);
      pPropSet->AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
   }
};

[!UWAGA]

W przypadku zmiany rekordu klasy użytkownika lub pisać własne konsumenta, zmienne dane muszą znajdować się przed zmienne stanu i długość.

Na potrzeby debugowania, można użyć wartości stanu.Jeśli kod wygenerowany przez ATL OLE DB konsumenta kreatora generuje błędy kompilacji, takie jak DB_S_ERRORSOCCURRED lub DB_E_ERRORSOCCURRED, najpierw należy spojrzeć na bieżące wartości pola Stan danych członków.Te, które mają niezerowe wartości odpowiadają kolumnom przestępstwa.

Aby ustawić wartość NULL dla danego pola umożliwia także wartości stanu.Ten sposób pomaga w przypadkach, w których chcesz odróżnić wartości pola jako wartość NULL, a nie zero.To do Ciebie, aby zdecydować, czy wartość NULL jest prawidłową wartość lub wartość specjalnych i zdecydować, jak aplikacja powinien potraktować go.OLE DB definiuje DBSTATUS_S_ISNULL jako poprawny sposób określenia ogólna wartość NULL.Jeśli konsument odczytuje dane i ma wartość null, wartość pola stan jest równa DBSTATUS_S_ISNULL.Jeśli konsument chce ustawić wartość NULL, konsument ustawia wartość stanu DBSTATUS_S_ISNULL przed wywołaniem dostawca.

Następnie należy otworzyć Oledb.h i wyszukaj DBSTATUSENUM.Następnie można dopasować liczbową wartość różną od zera statusu przeciwko DBSTATUSENUM wartości wyliczenia.Jeśli nazwa wyliczenia nie jest wystarczające stwierdzić, na czym polega problem, zobacz temat "Status" w sekcji "Powiązania danych wartości" OLE DB Programmer's Guide.Ten temat zawiera tabele używane podczas pobierania lub ustawienie danych wartości stanu.Aby uzyskać informacji o wartości długości zobacz temat "Długość" w tej samej sekcji.

Pobieranie długości lub stan kolumny

Można pobrać stanu kolumny lub długość kolumny o zmiennej długości (Aby sprawdzić DBSTATUS_S_ISNULL, na przykład):

  • Aby uzyskać długość, należy COLUMN_ENTRY_LENGTH makro.

  • Aby uzyskać stan, należy COLUMN_ENTRY_STATUS makro.

  • Aby uzyskać zarówno, 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()
};

CTable<CAccessor<CProducts > > product;

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", szName, nNameLength);
}

Użycie CDynamicAccessor, długość i stanu są powiązane dla Ciebie automatycznie.Służy do pobierania wartości długości i stanu, GetLength i GetStatus funkcji elementów członkowskich.

Zobacz też

Informacje

Praca z szablonami konsumentów OLE DB