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 determinada tabela no banco de dados.Os atributos de banco de dados simplificam algumas das declarações de modelo você anteriormente tinha de fazer.
Para demonstrar o uso de atributos do banco de dados, as seções a seguir mostram duas tabela equivalente e declarações de registro de classe de usuário: o primeiro usa atributos e o segundo usa modelos OLE DB.Essa declaração código é geralmente colocado em um arquivo de cabeçalho chamado para o objeto de tabela ou comando, por exemplo, Authors.h.
Comparando 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, com modelos com declara dois: CAuthorsNoAttrAccessor e CAuthorsNoAttr.
The db_source telefonar na versão atribuída é equivalente a OpenDataSource() Chame na declaração do modelo.
The db_table telefonar na versão atribuída é equivalente a seguinte declaração do modelo:
class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor> >
The db_column chamadas na versão atribuída são equivalentes ao MAP da coluna (consulte BEGIN_COLUMN_MAP ... END_COLUMN_MAP) na declaração do modelo.
Os atributos de injetar uma declaração de classe de registro de usuário para você.A classe de registro do 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 só pode exibir sua declaração no código injetado. Para obter mais informações, consulte "Classes de registro de usuário atributo-Injected"Registros de usuário.
Observe que o atribuída tanto o código de modelo, você deve definir propriedades do conjunto de linhas usando CDBPropSet::AddProperty.
Para obter informações sobre os atributos discutidos neste tópico, consulte OLE DB consumidor atributos.
Tabela e acessador declaração Using Attributes
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 ser usado. db_table injeta o código de modelo apropriado para declarar uma classe de tabela.db_column especificar o MAP de coluna e inserir a declaração de acessador.Você pode usar atributos de consumidor OLE DB em qualquer projeto que suporte ATL.
Aqui está a tabela e acessador declaração 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 acessador usando modelos e tabela
Aqui está a declaração de tabela e assessor 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();
}
};