Udostępnij za pośrednictwem


Upraszczanie dostępu do danych za pomocą atrybutów bazy danych

W tym temacie przedstawiono użycie atrybutów bazy danych w celu uproszczenia operacji bazy danych.

Podstawowym sposobem uzyskiwania dostępu do informacji z bazy danych jest utworzenie klasy polecenia (lub tabeli) i klasy rekordów użytkownika dla określonej tabeli w bazie danych. Atrybuty bazy danych upraszczają niektóre deklaracje szablonu, które wcześniej trzeba było wykonać.

Aby zademonstrować użycie atrybutów bazy danych, w poniższych sekcjach przedstawiono dwie równoważne deklaracje klas tabel i rekordów użytkownika: pierwszy używa atrybutów, a drugi używa szablonów OLE DB. Taki kod deklaracji jest zwykle umieszczany w pliku nagłówkowym o nazwie dla obiektu tabeli lub polecenia, na przykład Author.h.

Porównując dwa pliki, można zobaczyć, ile prostsze jest użycie atrybutów. Wśród różnic są następujące:

  • Za pomocą atrybutów należy zadeklarować tylko jedną klasę: , natomiast w przypadku szablonów należy zadeklarować dwie klasy: CAuthorsCAuthorsNoAttrAccessor i CAuthorsNoAttr.

  • db_source Wywołanie w wersji przypisanej jest równoważne OpenDataSource() wywołaniu w deklaracji szablonu.

  • Wywołanie db_table w wersji przypisanej jest równoważne następującej deklaracji szablonu:

    class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor>>
    
  • db_column Wywołania w wersji przypisanej są równoważne mapie kolumn (patrz BEGIN_COLUMN_MAP ... END_COLUMN_MAP) w deklaracji szablonu.

Atrybuty wprowadzają deklarację klasy rekordu użytkownika. Klasa rekordów użytkownika jest równa CAuthorsNoAttrAccessor deklaracji szablonu. Jeśli klasa tabeli to CAuthors, wstrzyknięta klasa rekordu użytkownika ma nazwę CAuthorsAccessor, i można wyświetlić jej deklarację tylko we wstrzykniętym kodzie. Aby uzyskać więcej informacji, zobacz "Attribute-Injected User Record Classes" (Klasy rekordów użytkownika wstrzykiwanych atrybutami) w temacie User Records (Rekordy użytkowników).

W kodzie przypisanym i szablonowym należy ustawić właściwości zestawu wierszy przy użyciu polecenia CDBPropSet::AddProperty.

Aby uzyskać informacje o atrybutach omówionych w tym temacie, zobacz Atrybuty konsumenta OLE DB.

Uwaga

include Poniższe instrukcje są wymagane do skompilowania poniższych przykładów:

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

Deklaracja tabeli i metody dostępu przy użyciu atrybutów

Następujące wywołania db_source kodu i db_table w klasie tabeli. db_source określa źródło danych i połączenie, które ma być używane. db_table wprowadza odpowiedni kod szablonu w celu zadeklarowania klasy tabeli. db_column określ mapę kolumn i wstrzyknąć deklarację dostępu. Atrybuty konsumenta OLE DB można używać w dowolnym projekcie obsługującym bibliotekę ATL.

Oto tabela i deklaracja metody dostępu przy użyciu atrybutów:

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

Deklaracja tabeli i metody dostępu przy użyciu szablonów

Oto tabela i deklaracja metody dostępu przy użyciu szablonów.

//////////////////////////////////////////////////////////////////////
// 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();
   }
};

Zobacz też

Atrybuty konsumentów OLE DB