Datoví členové stavu pole v přístupových objektech generovaných průvodcem
Průvodce příjemcem ATL OLE DB není v sadě Visual Studio 2019 a novější k dispozici. Funkci můžete přidat ručně. Další informace naleznete v tématu Vytvoření příjemce bez použití průvodce.
Když použijete Průvodce příjemcem ATL OLE DB k vytvoření příjemce, průvodce vygeneruje datový člen ve třídě záznamů uživatele pro každé pole, které zadáte v mapě sloupců. Každý datový člen je typu DWORD
a obsahuje hodnotu stavu odpovídající příslušnému poli.
Například pro datový člen m_OwnerID průvodce vygeneruje další datový člen pro stav pole (dwOwnerIDStatus) a druhý pro délku pole (dwOwnerIDLength). Vygeneruje také mapu sloupců s COLUMN_ENTRY_LENGTH_STATUS položkami.
Toto je znázorněno v následujícím kódu:
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()
...
Poznámka:
Pokud upravíte třídu záznamů uživatele nebo napíšete vlastního příjemce, musí proměnné dat předcházet stavu a proměnným délky.
Hodnoty stavu můžete použít pro účely ladění. Pokud kód vygenerovaný průvodce příjemcem 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. Hodnoty, které mají nenulové hodnoty, odpovídají sloupcům, u kterých došlo k urychlování.
Hodnoty stavu můžete také použít k nastavení hodnoty NULL pro konkrétní pole. To vám pomůže v případech, kdy chcete rozlišovat hodnotu pole jako hodnotu NULL místo nuly. Je na vás, abyste se rozhodli, jestli je hodnota NULL platná nebo speciální hodnota, a rozhodnout, jak by ji měla vaše aplikace zpracovat. OLE DB definuje DBSTATUS_S_ISNULL jako správný způsob zadání obecné hodnoty NULL. Pokud příjemce čte data a hodnota má hodnotu null, je pole stavu nastaveno na DBSTATUS_S_ISNULL. Pokud chce příjemce nastavit hodnotu NULL, nastaví příjemce hodnotu stavu na DBSTATUS_S_ISNULL před voláním zprostředkovatele.
Pak otevřete Oledb.h a vyhledejte DBSTATUSENUM. Pak můžete shodovat číselnou hodnotu nenulového stavu s hodnotami výčtu DBSTATUSENUM. Pokud název výčtu nestačí k tomu, abyste zjistili, co je špatně, přečtěte si téma Stav v části Hodnoty vazby dat v Příručce programátora OLE DB. Toto téma obsahuje tabulky hodnot stavu, které se používají při získávání nebo nastavování dat. Informace o hodnotách délky najdete v tématu Délka ve stejné části.
Načtení délky nebo stavu sloupce
Můžete načíst délku sloupce s proměnnou délkou nebo stav sloupce (pokud chcete zkontrolovat například DBSTATUS_S_ISNULL):
Pokud chcete získat délku, použijte makro COLUMN_ENTRY_LENGTH.
Stav získáte pomocí COLUMN_ENTRY_STATUS makra.
Pokud chcete získat obojí, použijte COLUMN_ENTRY_LENGTH_STATUS, jak je znázorně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() };
Pak přejděte k délce a/nebo stavu, jak je znázorněno:
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); }
Když použijete CDynamicAccessor
, délka a stav jsou pro vás vázány automaticky. Pokud chcete načíst hodnoty délky a stavu, použijte GetLength
funkce a GetStatus
členské funkce.