Pole Stav datové členy v přístupové objekty vytvořené pomocí Průvodce
Pokud používáte průvodce příjemcem ATL OLE DB, průvodce vytváří datový člen ve třídě záznamu uživatele pro každé pole, které určíte v mapě sloupců.Každý datový člen je typu DWORD a obsahuje stavovou hodnotu, odpovídající jeho příslušnému poli.
Například pro datový člen m_OwnerID průvodce vygeneruje dodatečný datový člen pro stav pole (dwOwnerIDStatus) a další pro délku pole (dwOwnerIDLength).Generuje také mapu sloupců s položkami COLUMN_ENTRY_LENGTH_STATUS.
To je ukázáno v následujícím kódu:
[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);
}
};
[!POZNÁMKA]
Pokud změníte třídu uživatelského záznamu nebo napíšete svého vlastního příjemce, data proměnné musí přijít před stavem a délkou proměnných.
Hodnoty stavů můžete použít pro účely ladění.Pokud kód generovaný průvodcem příjemce ATL OLE DB generuje chyby kompilace, jako je DB_S_ERRORSOCCURRED nebo DB_E_ERRORSOCCURRED, měli byste se nejprve podívat na aktuální hodnoty datových členů stavu pole.Ty, které mají nenulové hodnoty, odpovídají problematickým sloupcům.
Pomocí stavových hodnot také můžete nastavit hodnotu NULL pro určité pole.To vám pomůže v případech, ve kterém chcete odlišit hodnotu pole jako NULL namísto nuly.Je na vás se rozhodnout, zda je NULL platnou hodnotou nebo zvláštní hodnotou a rozhodnout se, jak s ní vaše aplikace bude pracovat.OLE DB definuje DBSTATUS_S_ISNULL jako správný prostředek, sloužící k určení obecné hodnoty NULL.Pokud příjemce čte data a hodnota je null, je pole stavu nastaveno na DBSTATUS_S_ISNULL.Pokud příjemce chce nastavit hodnotu NULL, příjemce nastaví hodnotu stavu na DBSTATUS_S_ISNULL před voláním poskytovatele.
Dále otevřete Oledb.h a vyhledejte DBSTATUSENUM.Potom můžete porovnat číselnou hodnotu nenulového stavu proti hodnotám výčtu DBSTATUSENUM.Pokud není dostatečný zjistit, co je chybný název výčtu, naleznete v tématu "Stav" v části "Vazba dat hodnoty" OLE DB Programmer's Guide.Toto téma obsahuje tabulky hodnot stavů, používaných při získávání nebo nastavování dat.Pro informace o délce hodnot si prohlédněte téma "Délka" ve stejném oddílu.
Načítání délky nebo stavu sloupce
Můžete načíst délku sloupce s proměnnou délkou nebo stav sloupce (chcete-li jej zkontrolovat na DBSTATUS_S_ISNULL, například):
Chcete-li získat délku, použijte makro COLUMN_ENTRY_LENGTH.
Chcete-li získat stav, použijte makro COLUMN_ENTRY_STATUS.
Chcete-li získat obojí, použijte COLUMN_ENTRY_LENGTH_STATUS, jak je ukázáno níže.
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);
}
Při použití CDynamicAccessor, je délka a stav svázána automaticky.Pro načtení hodnot délky a stavu použijte členské funkce GetLength a GetStatus.