共用方式為


擷取資料

開啟數據源、工作階段和資料列集物件之後,您可以擷取數據。 根據您使用的存取子類型,您可能需要系結數據行。

擷取數據

  1. 使用適當的 Open 命令開啟資料列集。

  2. 如果您使用 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();
    
  3. 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()
    }
    
  4. 在迴圈中 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);
      }
      
    • 如果您使用 CDynamicAccessorCDynamicParameterAccessor 類別,您可以使用存取函 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);
      }
      

另請參閱

使用 OLE DB 消費者範本