Semplificazione dell'accesso ai dati con gli attributi del database
In questo argomento viene illustrato l'uso degli attributi del database per semplificare le operazioni del database.
Il modo di base per accedere alle informazioni da un database consiste nel creare una classe di comando (o tabella) e una classe di record utente per una tabella specifica nel database. Gli attributi del database semplificano alcune delle dichiarazioni di modello che in precedenza era necessario eseguire.
Per illustrare l'uso degli attributi del database, nelle sezioni seguenti vengono illustrate due dichiarazioni di classe di record utente e di tabella equivalenti: la prima usa gli attributi e la seconda usa i modelli OLE DB. Questo codice di dichiarazione viene in genere inserito in un file di intestazione denominato per l'oggetto tabella o comando, ad esempio Authors.h.
Confrontando i due file, è possibile vedere quanto più semplice è usare gli attributi. Tra le differenze vi sono:
Usando gli attributi, è necessario dichiarare solo una classe:
CAuthors
, mentre con i modelli è necessario dichiarare due:CAuthorsNoAttrAccessor
eCAuthorsNoAttr
.La
db_source
chiamata nella versione con attributi equivale allaOpenDataSource()
chiamata nella dichiarazione del modello.La
db_table
chiamata nella versione con attributi equivale alla dichiarazione di modello seguente:class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor>>
Le
db_column
chiamate nella versione con attributi sono equivalenti alla mappa delle colonne (vedereBEGIN_COLUMN_MAP ... END_COLUMN_MAP
) nella dichiarazione del modello.
Gli attributi inserisce automaticamente una dichiarazione di classe di record utente. La classe di record utente è uguale a CAuthorsNoAttrAccessor
nella dichiarazione del modello. Se la classe di tabella è CAuthors
, la classe di record utente inserita è denominata CAuthorsAccessor
e è possibile visualizzarne solo la dichiarazione nel codice inserito. Per altre informazioni, vedere "Classi di record utente inseriti con attributi" nei record utente.
Sia nel codice con attributi che nel codice basato su modelli, è necessario impostare le proprietà del set di righe usando CDBPropSet::AddProperty
.
Per informazioni sugli attributi descritti in questo argomento, vedere Attributi consumer OLE DB.
Nota
Per compilare gli esempi seguenti sono necessarie le istruzioni seguenti include
:
#include <atlbase.h> #include <atlplus.h> #include <atldbcli.h>
Dichiarazione di tabella e funzione di accesso tramite attributi
Il codice seguente chiama db_source
e db_table
sulla classe della tabella. db_source
specifica l'origine dati e la connessione da utilizzare. db_table
inserisce il codice modello appropriato per dichiarare una classe di tabella. db_column
specificare la mappa delle colonne e inserire la dichiarazione della funzione di accesso. È possibile usare gli attributi consumer OLE DB in qualsiasi progetto che supporti ATL.
Ecco la dichiarazione di tabella e funzione di accesso usando gli attributi:
//////////////////////////////////////////////////////////////////////
// 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);
}
};
Dichiarazione di tabella e funzione di accesso tramite modelli
Ecco la dichiarazione della tabella e della funzione di accesso usando i modelli.
//////////////////////////////////////////////////////////////////////
// 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();
}
};