Partilhar via


Membros de dados do status de campo em acessadores gerados por assistente

Quando você usa o assistente do consumidor de ATL OLE DB para criar um consumidor, o assistente gerencie um membro de dados na classe de registro do usuário para cada campo que você especifica em seu mapa da coluna. Cada membro de dados é do tipo DWORD e contém um valor de status que corresponde ao campo correspondente.

Por exemplo, para um m_OwnerIDdo membro de dados, o assistente gerencie um membro de dados adicional para o status do campo (dwOwnerIDStatus) e outro para o tamanho do campodwOwnerIDLength(). Também gerencia um mapa de coluna com entradas de COLUMN_ENTRY_LENGTH_STATUS .

Isso é mostrado no seguinte código:

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

Dica

Se você alterar a classe de registro do usuário ou escrever seu próprio consumidor, variáveis de dados devem vir antes de variáveis de status e comprimento.

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

Você também pode usar os valores de status para definir um valor NULO para um campo específico. Fazendo isso ajuda nos casos em que você deseja diferenciar um valor de campo como NULL em vez de zero. Cabe a você decidir se NULL é um valor válido ou um valor especial e decidir como seu aplicativo deve tratar o. OLE DB define DBSTATUS_S_ISNULL como as mídias corretas de especificar um valor NULO genérico. Se o consumidor ler os dados e o valor for nulo, o campo de status é definido como DBSTATUS_S_ISNULL. Se o consumidor deseja definir um valor NULO, o consumidor define o valor de status a DBSTATUS_S_ISNULL antes de chamar o provedor.

Em seguida, Oledb.h aberto e pesquisa de DBSTATUSENUM. Você pode então corresponder ao valor numérico de status diferente de zero com os valores de enumeração de DBSTATUSENUM . Se o nome da enumeração não é suficiente para informar ele o que está errado, consulte o tópico “status” “associar na seção de valores de dados” de Guia de O programador de OLE DB. Este tópico contém tabelas dos valores de status usados para obter ou ao definir dados. Para obter informações sobre os valores de comprimento, consulte o tópico “comprimento” na seção.

Recuperando o comprimento ou o status de uma coluna

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

  • Para obter o comprimento, use a macro de COLUMN_ENTRY_LENGTH .

  • Para obter o status, use a macro de COLUMN_ENTRY_STATUS .

  • 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 o status são associados para você automaticamente. Para recuperar os valores de comprimento e de status, use GetLength e as funções de membro de GetStatus .

Consulte também

Referência

Trabalhando com modelos de consumidor de banco de dados OLE