擷取資料
您可以在開啟資料來源、工作階段和資料列集物件之後擷取資料。 根據所使用的存取子型別而定,您可能需要繫結資料行。
若要擷取資料
使用適當的 [開啟] 命令開啟資料列集。
如果您正在使用 CManualAccessor,請繫結輸出資料行 (如果您還沒完成這個動作)。 若要繫結資料行,請呼叫 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); }