Partilhar via


Simplificando o acesso a dados com atributos de banco de dados

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

A forma 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 declarações do modelo que você anteriormente tinha de fazer.

Para demonstrar o uso de atributos do banco de dados, as seções a seguir mostram dois equivalente tabela e declarações de classe do registro de usuário: o primeiro usa atributos e o segundo usa modelos OLE DB.Tal declaração código é normalmente colocado em um arquivo de cabeçalho chamado para o objeto de tabela ou comando, por exemplo, Authors.h.

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

  • Usando atributos, você só precisa declarar uma classe: CAuthors, enquanto com modelos você precisa declarar dois: CAuthorsNoAttrAccessor e CAuthorsNoAttr.

  • O db_source chamada na versão atribuída é equivalente a OpenDataSource() chamada na declaração do modelo.

  • O db_table chamada na versão atribuída é equivalente a seguinte declaração de modelo:

    class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor> >
    
  • O db_column chamadas na versão atribuída são equivalentes ao mapa de coluna (consulte BEGIN_COLUMN_MAP ... END_COLUMN_MAP) na declaração do modelo.

Os atributos de injetar uma declaração de classe do registro de usuário para você.A classe de registro de usuário é equivalente a CAuthorsNoAttrAccessor na declaração do modelo.Se sua classe de tabela é CAuthors, a classe de registro de usuário injetado chamada CAuthorsAccessor, e você só pode exibir sua declaração no código injetado.Para obter mais informações, consulte "Classes de registro de usuário Attribute-Injected" em Registros de usuário.

Observe que a atribuída tanto o código de modelo, você deve definir propriedades de conjunto de linhas usando CDBPropSet::AddProperty.

Para obter informações sobre os atributos discutidos neste tópico, consulte OLE DB consumidor atributos.

Tabela e declaração de acessador usando atributos

O seguinte código chama db_source e db_table na classe de tabela.db_sourceEspecifica a fonte de dados e conexão a ser usado.db_table injeta o código de modelo apropriado para declarar uma classe de tabela.db_column especificar o mapa de coluna e inserir a declaração de acessador.Você pode usar atributos de consumidor do OLE DB em qualquer projeto que suporte ATL.

Aqui está a declaração de tabela e 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:
   DWORD m_dwAuIDStatus;
   DWORD m_dwAuthorStatus;
   DWORD m_dwYearBornStatus;
   DWORD m_dwAuIDLength;
   DWORD m_dwAuthorLength;
   DWORD 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 acessador usando modelos e tabela

Aqui está 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();
   }
};

Consulte também

Outros recursos

OLE DB consumidor atributos

Attributes Walkthroughs