Compartilhar via


Simplificando acesso a dados com atributos de banco de dados

Este tópico demonstra o uso de atributos de banco de dados para simplificar as operações de banco de dados.

A maneira básica de acessar informações de um banco de dados é criar uma classe de comando (ou tabela) e uma classe de registro de usuário para uma tabela específica no banco de dados. Os atributos do banco de dados simplificam algumas das declarações de modelo que você precisava fazer anteriormente.

Para demonstrar o uso de atributos de banco de dados, as seções a seguir mostram duas declarações de classe de registro de usuário e tabela equivalentes: a primeira usa atributos e a segunda usa modelos OLE DB. Esse código de declaração normalmente é colocado em um arquivo de cabeçalho nomeado para a tabela ou objeto de comando, por exemplo, Authors.h.

Comparando os dois arquivos, você pode ver o quanto é mais simples usar atributos. Entre as diferenças estão:

  • Ao usar atributos, você só precisa declarar uma classe: CAuthors, ao usar modelos, você precisa declarar duas: CAuthorsNoAttrAccessor e CAuthorsNoAttr.

  • A chamada db_source na versão com atributo é equivalente à chamada OpenDataSource() na declaração de modelo.

  • A chamada db_table na versão com atributo é equivalente à seguinte declaração de modelo:

    class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor>>
    
  • As chamadas db_column na versão com atributo são equivalentes ao mapa de coluna (confira BEGIN_COLUMN_MAP ... END_COLUMN_MAP) na declaração de modelo.

Os atributos injetam uma declaração de classe de registro de usuário para você. A classe de registro do usuário é igual à CAuthorsNoAttrAccessor na declaração de modelo. Se a classe de tabela for CAuthors, a classe de registro de usuário injetada será nomeada CAuthorsAccessor e você só poderá exibir sua declaração no código injetado. Para obter mais informações, confira "Classes de registro de usuário injetadas por atributo" nos Registros de Usuário.

No código com atributos e com modelo, você deve definir propriedades de conjunto de linhas usando CDBPropSet::AddProperty.

Para obter informações sobre os atributos discutidos neste tópico, confira Atributos de Consumidor OLE DB.

Observação

As instruções include a seguir são necessárias para compilar os exemplos abaixo:

#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>

Declaração de tabela e acessador usando atributos

O código a seguir chama db_source e db_table na classe de tabela. db_source especifica a fonte de dados e a conexão a serem usadas. db_table injeta o código de modelo apropriado para declarar uma classe de tabela. db_column especifica o mapa de colunas e injeta a declaração do acessador. Você pode usar atributos de consumidor OLE DB em qualquer projeto que dê suporte à ATL.

Aqui está a tabela e a declaração do acessador usando atributos:

//////////////////////////////////////////////////////////////////////
// Table and accessor declaration using attributes
// authors.h
//////////////////////////////////////////////////////////////////////

// Table class declaration
// (Note that you must provide your own connection string for db_source.)
[
   db_source(L"your connection string"),
   db_table("Authors")
]
class CAuthors
{
public:
   DBSTATUS m_dwAuIDStatus;
   DBSTATUS m_dwAuthorStatus;
   DBSTATUS m_dwYearBornStatus;
   DBLENGTH m_dwAuIDLength;
   DBLENGTH m_dwAuthorLength;
   DBLENGTH m_dwYearBornLength;
   [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_CANFETCHBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_IRowsetChange, true);
   }
};

Declaração de tabela e acessador usando modelos

Aqui está a a declaração de tabela e acessador usando modelos.

//////////////////////////////////////////////////////////////////////
// Table and user record class declaration using templates
// authors.h
//////////////////////////////////////////////////////////////////////

// User record class declaration
class CAuthorsNoAttrAccessor
{
public:
   DWORD m_dwAuIDStatus;
   DWORD m_dwAuthorStatus;
   DWORD m_dwYearBornStatus;
   DWORD m_dwAuIDLength;
   DWORD m_dwAuthorLength;
   DWORD m_dwYearBornLength;
   LONG m_AuID;
   TCHAR m_Author[51];
   SHORT m_YearBorn;
   void GetRowsetProperties(CDBPropSet* pPropSet)
   {
      pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
      pPropSet->AddProperty(DBPROP_IRowsetChange, true);
   }
   HRESULT OpenDataSource()
   {
      CDataSource _db;

HRESULT hr;
      hr = _db.OpenFromInitializationString(L"your connection string");
      if (FAILED(hr))
      {
#ifdef _DEBUG
         AtlTraceErrorRecords(hr);
#endif
         return hr;
      }
      return m_session.Open(_db);
   }
   void CloseDataSource()
   {
      m_session.Close();
   }
   operator const CSession&()
   {
      return m_session;
   }
   CSession m_session;
   BEGIN_COLUMN_MAP(CAuthorsNoAttrAccessor)
      COLUMN_ENTRY_LENGTH_STATUS(1, m_AuID, m_dwAuIDLength, m_dwAuIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(2, m_Author, m_dwAuthorLength, m_dwAuthorStatus)
      COLUMN_ENTRY_LENGTH_STATUS(3, m_YearBorn, m_dwYearBornLength, m_dwYearBornStatus)
   END_COLUMN_MAP()
};
class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor>>
{
public:
   HRESULT OpenAll()
   {
HRESULT hr;
      hr = OpenDataSource();
      if (FAILED(hr))
         return hr;
      __if_exists(GetRowsetProperties)
      {
         CDBPropSet propset(DBPROPSET_ROWSET);
         __if_exists(HasBookmark)
         {
            propset.AddProperty(DBPROP_IRowsetLocate, true);
         }
         GetRowsetProperties(&propset);
         return OpenRowset(&propset);
      }
      __if_not_exists(GetRowsetProperties)
      {
         __if_exists(HasBookmark)
         {
            CDBPropSet propset(DBPROPSET_ROWSET);
            propset.AddProperty(DBPROP_IRowsetLocate, true);
            return OpenRowset(&propset);
         }
      }
      return OpenRowset();
   }
   HRESULT OpenRowset(DBPROPSET *pPropSet = NULL)
   {
HRESULT hr = Open(m_session, "Authors", pPropSet);
#ifdef _DEBUG
      if(FAILED(hr))
         AtlTraceErrorRecords(hr);
#endif
      return hr;
   }
   void CloseAll()
   {
      Close();
      CloseDataSource();
   }
};

Confira também

Atributos de consumidor do OLE DB