Pole Stan danych członków w akcesorach wygenerowany przez kreatora
Gdy ATL OLE DB konsumenta Kreator umożliwia tworzenie konsumenta, Kreator generuje członek danych w klasie rekordu użytkownika, dla każdego pola w kolumnie mapę.Każdy członek danych jest typu DWORD i zawiera wartość stanu odpowiadającego jej pola odpowiednimi.
Na przykład dla członka danych m_OwnerID, Kreator generuje członka dodatkowych danych w polu Stan (dwOwnerIDStatus) i drugi dla pola Długość (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]
Modyfikowanie rekordu klasy użytkownika lub napisać własny konsumenta, zmienne dane muszą znajdować się przed zmienne stanu i długości.
Można użyć wartości stanu na potrzeby debugowania.Jeśli kod generowany przez ATL OLE DB konsumenta Kreator generuje błędy kompilacji takich jak DB_S_ERRORSOCCURRED lub DB_E_ERRORSOCCURRED, najpierw należy zwrócić uwagę na bieżące wartości pola stan danych członków.Te, które mają niezerowe wartości odpowiadają kolumnom naruszającego.
Wartości stanu umożliwia także ustawić wartość NULL dla danego pola.Pomoże w przypadkach, w których chcesz odróżnić wartości pola jako NULL niż zero.To można 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 rodzajowy wartość NULL.Jeśli konsument odczytuje dane i wartość null, pole Stan jest ustawione na DBSTATUS_S_ISNULL.Jeśli konsument chce ustawić wartość NULL, konsument ustawia wartość stanu DBSTATUS_S_ISNULL przed wywołaniem dostawca.
Następnie otwórz Oledb.h i wyszukaj DBSTATUSENUM.Następnie można dopasować liczbową wartość niezerową statusu przeciwko DBSTATUSENUM wartości wyliczenia.Jeśli nazwa wyliczania nie jest wystarczające, aby stwierdzić, na czym polega problem, zobacz temat "Stan" w sekcji "Wiązanie danych wartości" OLE DB Programmer's Guide.Ten temat zawiera tabele używane podczas pobierania lub ustawienie danych wartości stanu.Uzyskać długość wartości zobacz temat "Długość" w tej samej sekcji.
Trwa pobieranie długości lub stanu kolumny
Można pobrać długość kolumny o zmiennej długości lub status kolumny (Aby sprawdzić, czy 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, należy 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);
}
Kiedy używać CDynamicAccessor, długość i stanu są powiązane można automatycznie.Aby pobrać wartości długości i stan, należy użyć GetLength i GetStatus funkcji elementów członkowskich.