データのフェッチ
データ ソース、セッション、行セットのオブジェクトを開いた後は、データをフェッチできます。 使っているアクセサーの種類によっては、列のバインドが必要になる場合があります。
データをフェッチするには
適切な 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); }