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

W tym temacie zademonstrowano użycie atrybutów bazy danych, aby uprościć operacji bazy danych.

Jest to podstawowy sposób dostępu do informacji z bazy danych do tworzenia polecenia (lub tabela) Klasa i klasy rekordu użytkownika dla określonej tabeli w bazie danych.Atrybuty bazy danych uprościć niektóre deklaracje szablonu, które poprzednio trzeba było zrobić.

Przedstawimy sposób korzystania z atrybutów bazy danych, w poniższych sekcjach przedstawiono dwie równoważne tabela i deklaracji klasy rekordu użytkownika: atrybuty używa pierwszy i drugi przy użyciu szablonów OLE DB.Takie kod deklaracji zazwyczaj znajduje się w pliku nagłówka o nazwie dla tabeli lub polecenie obiekt, na przykład Authors.h.

Porównywanie dwóch plików, można zobaczyć, jak łatwiej jest używać atrybutów.Wśród różnice są:

  • Za pomocą atrybutów, wystarczy zadeklarować jedną klasę: CAuthors, podczas gdy z szablonami należy zadeklarować dwa: CAuthorsNoAttrAccessor i CAuthorsNoAttr.

  • db_source Wywołanie WE przewidywanego wersji jest równoważne z OpenDataSource() zadzwonić w deklaracji z szablonu.

  • Db_table wywołanie WE przewidywanego wersji jest odpowiednikiem następującej deklaracji szablonu:

    class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor> >
    
  • Db_column wywołania WE przewidywanego wersji są równoważne mapę kolumny (zobacz BEGIN_COLUMN_MAP ... END_COLUMN_MAP) w deklaracji z szablonu.

Atrybuty wstrzyknąć deklaracji rekordu klasy użytkownika dla Ciebie.Klasa rekordu użytkownika jest równoważne z CAuthorsNoAttrAccessor w deklaracji z szablonu.Jeśli klasa tabeli jest CAuthors, nosi nazwę klasy rekordu użytkownika wtryskiwanego CAuthorsAccessor, i może wyświetlać tylko swoją deklarację w kodzie wstrzyknięta.Aby uzyskać więcej informacji, zobacz "Klasy rekordu użytkownika Attribute-Injected" w Rekordów użytkowników.

Należy zauważyć, że zarówno przypisane i kod opartych na szablonach, należy ustawić właściwości zestaw wierszy za pomocą CDBPropSet::AddProperty.

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

Tabela i deklaracji metoda dostępu przy użyciu atrybutów

Poniższy kod wywoła db_source i db_table w klasie tabeli.db_sourceOkreśla źródło danych i połączenia ma być używany.db_table wstrzykuje kod odpowiedni szablon, aby zadeklarować klasy tabeli.db_column określić mapowanie kolumn i wstrzyknąć deklaracji akcesor.Atrybuty konsumenta OLE DB można użyć w którymkolwiek z projektów, który obsługuje ATL.

Oto deklaracji tabeli i metoda 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:
   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);
   }
};

Tabela i deklaracji akcesor przy użyciu szablonów

W tym miejscu jest deklaracja tabeli i metoda 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ż

Inne zasoby

Atrybuty konsumentów OLE DB

Attributes Walkthroughs