Partilhar via


Membros de dados do campo Status nos acessadores gerado pelo Assistente

Quando você usar a ATL OLE DB consumidor Wizard para criar um consumidor, o assistente gera um membro de dados da 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 valor de status correspondente ao seu respectivo campo.

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 assistente gera erros de compilação como DB_S_ERRORSOCCURRED ou DB_E_ERRORSOCCURRED, primeiro você deve 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 nulo para um determinado campo.Isso ajuda em casos em que você deseja diferenciar um valor de campo como NULL em vez de zero.É você 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 nulo genérico.Se o consumidor lê os dados e o valor for nulo, o campo status é definido como DBSTATUS_S_ISNULL.Se o consumidor desejar 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 DBSTATUSENUM.Então você pode combinar o valor numérico do status diferente de zero em relação a DBSTATUSENUM valores de enumeração.Se o nome de enumeração não é suficiente para dizer o que está errado, consulte o tópico "Status" na seção "Valores de vinculação de dados" a OLE DB Programmer guia.Este tópico contém tabelas de valores de status usada ao obter ou definir dados.Para informações sobre valores de comprimento, consulte o tópico "Comprimento" na mesma seção.

Recuperando o Status de uma coluna ou de comprimento

Você pode recuperar o status de uma coluna ou o comprimento de uma coluna de comprimento variável (para verificar 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 ambos, use COLUMN_ENTRY_LENGTH_STATUS, como 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 status são acoplados para você automaticamente.Para recuperar os valores de comprimento e status, use o GetLength e GetStatus funções de membro.

Consulte também

Referência

Trabalhando com modelos OLE DB consumidor