次の方法で共有


CRecordset::FlushResultSet

更新 : 2007 年 11 月

複数の結果セットが存在する場合は、定義済みクエリ (組み込み手続き) の次の結果セットを取得します。

BOOL FlushResultSet( );

戻り値

取得する結果セットがさらに存在する場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

現在の結果セットでのカーソル操作が完了したときだけ、FlushResultSet を呼び出します。FlushResultSet を呼び出して次の結果セットを取得する場合、呼び出した結果セットのカーソルは無効です。FlushResultSet を呼び出した後、MoveNext メンバ関数を呼び出します。

定義済みクエリが出力パラメータまたは入出力パラメータを使用する場合は、これらのパラメータを取得するには、FALSE (値は 0) を返すまで FlushResultSet を呼び出します。

FlushResultSet は、ODBC API の関数 SQLMoreResults を呼び出します。SQLMoreResultsSQL_ERROR または SQL_INVALID_HANDLE を返す場合、FlushResultSet は例外をスローします。SQLMoreResults の詳細については、Windows SDK を参照してください。

Visual C++ 2005 で、FlushResultSet を呼び出す場合、ストアド プロシージャにはバインドされたフィールドが必要です。

例外

このメソッドは、CDBException* 型の例外をスローできます。

使用例

次の例では、COutParamRecordset は、入力パラメータと出力パラメータを持ち、複数の結果セットを持つ定義済みクエリを元にした CRecordset 派生オブジェクトであることを想定しています。DoFieldExchange のオーバーライドの構造に注意してください。

// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputParam);
   RFX_Long(pFX, _T("Param1"), m_nCountParam);
      // The "Param1" name here is a dummy name 
      // that is never used

   pFX->SetFieldType(CFieldExchange::inputParam);
   RFX_Text(pFX, _T("Param2"), m_strNameParam);
      // The "Param2" name here is a dummy name 
      // that is never used
}
// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");

// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor 
//       type for multiple rowset returning stored 
//       procedures
rs.Open(CRecordset::forwardOnly, 
         _T("{? = CALL GetCourses( ? )}"), 
         CRecordset::readOnly);

// Loop through all the data in the first result set
while (!rs.IsEOF())
{
   CString strFieldValue;
   for(short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
   {
      rs.GetFieldValue(nIndex, strFieldValue);

      // TO DO: Use field value string.
   }
   rs.MoveNext();
}

// Retrieve other result sets...
while(rs.FlushResultSet())
{
   // must call MoveNext because cursor is invalid
   rs.MoveNext();

   while (!rs.IsEOF())
   {
      CString strFieldValue;
      for(short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
      {
         rs.GetFieldValue(nIndex, strFieldValue);

         // TO DO: Use field value string.
      }
      rs.MoveNext();
   }
}


// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.

// TO DO: Use m_nCountParam

// Cleanup
rs.Close();

必要条件

ヘッダー : afxdb.h

参照

参照

CRecordset クラス

階層図

CFieldExchange::SetFieldType

その他の技術情報

CRecordset のメンバ