Sdílet prostřednictvím


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.

Viz také

Práce s šablonami příjemců OLE DB