Membros de dados do campo Status nos acessadores gerado pelo Assistente

Quando você usa o ATL OLE DB consumidor Wizard para criar um consumidor, o assistente gera um membro de dados na classe de registro de usuário para cada campo que você especificar no seu mapa de coluna. Cada membro de dados é do tipo DWORD e contém um correspondente de valor de status para seus respectivos campos.

Por exemplo, para um membro de dados m_OwnerID, o assistente gera um membro de dados adicionais para o status de campo (dwOwnerIDStatus) e outro para o comprimento do campo (dwOwnerIDLength). Ele também gera um mapa de coluna com COLUMN_ENTRY_LENGTH_STATUS entradas.

Isso é mostrado no código a seguir:

[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);
   }
};
ObservaçãoObservação

Se você modificar a classe de registro de usuário ou escreve seu próprio consumidor, as variáveis de dados devem vir antes das variáveis de status e de comprimento.

Você pode usar os valores de status para fins de depuração. Se o código gerado pelo ATL OLE DB consumidor Wizard gera erros de compilação como DB_S_ERRORSOCCURRED ou DB_E_ERRORSOCCURRED, você deve primeiro examinar os valores atuais dos membros de dados do campo status. Aqueles que têm valores diferentes de zero correspondem às colunas ofensivos.

Você também pode usar os valores de status para definir um valor NULL para um determinado campo. Isso ajuda você em casos em que você deseja distinguir um valor de campo como nulo em vez de zero. Ele é decidir se NULL é um valor válido ou um valor especial e decidir como seu aplicativo deve lidar com ele. OLE DB define DBSTATUS_S_ISNULL como o meio correto de especificar um valor NULL genérico. Se o consumidor lê os dados e o valor for nulo, o campo status está definido DBSTATUS_S_ISNULL. Se o consumidor quiser definir um valor nulo, o consumidor define o valor de status para DBSTATUS_S_ISNULL antes de chamar o provedor.

Em seguida, abra o OLEDB. h e procurar por DBSTATUSENUM. Você então pode corresponder ao valor numérico do status diferente de zero contra o DBSTATUSENUM valores de enumeração. Se o nome de enumeração não é suficiente para lhe informar o que está errado, consulte "Status" tópico de "vinculação de valores de dados" seção de OLE DB guia do programador do. Este tópico contém tabelas de valores de status, usadas ao obter ou definir os dados. Para obter informações sobre valores de comprimento, consulte "Comprimento" tópico na mesma seção.

Recuperando o Status de uma coluna ou de comprimento

Você pode recuperar o comprimento de uma coluna de comprimento variável ou o status de uma coluna (para verificar se há DBSTATUS_S_ISNULL, por exemplo):

  • Para obter o comprimento, use o COLUMN_ENTRY_LENGTH macro.

  • Para obter o status, use o COLUMN_ENTRY_STATUS macro.

  • Para obter a ambos, use COLUMN_ENTRY_LENGTH_STATUS, conforme mostrado abaixo.

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);
}

Quando você usa CDynamicAccessor, o comprimento e o status são vinculados para você automaticamente. Para recuperar os valores de comprimento e o status, use o GetLength e GetStatus funções de membro.

Consulte também

Referência

Trabalhando com modelos de consumidor do OLE DB