共用方式為


以資料庫屬性簡化資料存取

本主題示範如何使用資料庫屬性來簡化資料庫作業。

從數據庫存取資訊的基本方法是建立命令(或數據表)類別,以及資料庫中特定數據表的用戶記錄類別。 資料庫屬性可簡化您先前必須執行的一些範本宣告。

為了示範資料庫屬性的使用,下列各節顯示兩個對等數據表和用戶記錄類別宣告:第一個使用屬性,第二個使用 OLE DB 範本。 這類宣告程式代碼通常會放在名為 數據表或命令對象的頭檔中,例如 Authors.h。

藉由比較這兩個檔案,您可以看到使用屬性的簡單程度。 差異包括:

  • 使用屬性時,您只需要宣告一個類別: CAuthors,而使用範本時,您必須宣告兩個: CAuthorsNoAttrAccessorCAuthorsNoAttr

  • db_source屬性化版本中的呼叫相當於OpenDataSource()範本宣告中的呼叫。

  • db_table屬性化版本中的呼叫相當於下列範本宣告:

    class CAuthorsNoAttr : public CTable<CAccessor<CAuthorsNoAttrAccessor>>
    
  • 屬性 db_column 化版本中的呼叫相當於範本宣告中的數據行對應(請參閱 BEGIN_COLUMN_MAP ... END_COLUMN_MAP)。

屬性會為您插入使用者記錄類別宣告。 使用者記錄類別在樣本宣告中等於 CAuthorsNoAttrAccessor 。 如果您的數據表類別是 CAuthors,則插入的用戶記錄類別會命名為 CAuthorsAccessor,而且您只能在插入的程式代碼中檢視其宣告。 如需詳細資訊,請參閱用戶記錄中的「屬性插入用戶記錄類別」。

在屬性化和樣板化程式代碼中,您必須使用 CDBPropSet::AddProperty來設定數據列集屬性。

如需本主題所討論屬性的詳細資訊,請參閱 OLE DB 消費者屬性

注意

編譯下列範例需要下列 include 語句:

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

使用屬性的數據表和存取子宣告

下列程式代碼會在資料表類別上呼叫 db_sourcedb_tabledb_source 指定要使用的數據源和連接。 db_table 插入適當的範本程式代碼來宣告數據表類別。 db_column 指定數據行對應並插入存取子宣告。 您可以在任何支援 ATL 的專案中使用 OLE DB 取用者屬性。

以下是使用屬性的數據表和存取子宣告:

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

使用範本的數據表和存取子宣告

以下是使用範本的數據表和存取子宣告。

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

另請參閱

OLE DB 消費者屬性