擷取資料
開啟數據源、工作階段和資料列集物件之後,您可以擷取數據。 根據您使用的存取子類型,您可能需要系結數據行。
擷取數據
使用適當的 Open 命令開啟資料列集。
如果您使用
CManualAccessor
,如果您尚未這麼做,請系結輸出數據行。 下列範例取自 DBViewer 範例。 若要系結數據行,請呼叫GetColumnInfo
,然後使用系結建立存取子,如下列範例所示:// From the DBViewer Sample CDBTreeView::OnQueryEdit // Get the column information ULONG ulColumns = 0; DBCOLUMNINFO* pColumnInfo = NULL; LPOLESTR pStrings = NULL; if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK) ThrowMyOLEDBException(rs.m_pRowset, IID_IColumnsInfo); struct MYBIND* pBind = new MYBIND[ulColumns]; rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns); for (ULONG l=0; l<ulColumns; l++) rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue, NULL, &pBind[l].dwStatus); rs.Bind();
while
撰寫迴圈以擷取數據。 在迴圈中,呼叫MoveNext
以推進數據指標,並針對S_OK測試傳回值,如下列範例所示:while (rs.MoveNext() == S_OK) { // Add code to fetch data here // If you are not using an auto accessor, call rs.GetData() }
在迴圈中
while
,您可以根據存取子類型擷取數據。如果您使用 CAccessor 類別,則應該有包含資料成員的用戶記錄。 您可以使用這些資料成員來存取您的資料,如下列範例所示:
while (rs.MoveNext() == S_OK) { // Use the data members directly. In this case, m_nFooID // is declared in a user record that derives from // CAccessor wsprintf_s("%d", rs.m_nFooID); }
如果您使用
CDynamicAccessor
或CDynamicParameterAccessor
類別,您可以使用存取函GetValue
式 和GetColumn
來擷取數據,如下列範例所示。 如果您要判斷您使用的資料類型, 請使用GetType
。while (rs.MoveNext() == S_OK) { // Use the dynamic accessor functions to retrieve your data. ULONG ulColumns = rs.GetColumnCount(); for (ULONG i=0; i<ulColumns; i++) { rs.GetValue(i); } }
如果您使用
CManualAccessor
,您必須指定自己的數據成員、自行系結,並直接存取它們,如下列範例所示:while (rs.MoveNext() == S_OK) { // Use the data members you specified in the calls to // AddBindEntry. wsprintf_s("%s", szFoo); }