CRecordset::FlushResultSet

BOOL FlushResultSet() const;
  throw( CDBException );

返回值:
如果获取了多个结果集,则返回非零值;否则返回0。

说明:
此成员函数用来获取一个预定义的查询(被保存的过程)的下一个结果集,如果有多个结果集的话。只有在你完全完成了对在当前结果集上的游标的处理时,你才应该调用FlushResultSet。值得注意的是,当你通过调用FlushResultSet获取下一个结果集时,则在那一个结果集上的游标就无效了;你应当在调用FlushResultSet之后调用MoveNext成员函数。
如果一个预定义的查询使用了输出参数或者是输入/输出参数,则为了得到这些参数的值,你必须一直调用FlushResultSet直到它返回FALSE(值0)。
FlushResultSet调用了ODBC API函数SQLMoreResults。如果SQLMoreResults返回SQL_ERROR或SQL_INVALID_HANDLE,则FlushResultSet将抛出一个异常。要获取有关SQLMoreResults的更多信息,请参见“ODBC SDK程序员参考”。

示例:
下面的例子假定COutParamRecordset是一个基于预定义查询的Crecordset的派生对象,该查询具有一个输入参数和一个输出参数,并且有多个结果集。注意DoFieldExchange重载的结构。
// DoFieldExchange重载
// 只有在处理参数装订时才有必要。
// 不要使用有边界字段的CRecordset派生类,除非所有的结果集具有相同的概要或者是有条件的装订代码。
void COutParamRecordset::DoFieldExchange( CFieldExchange* pFX )
{
  pFX->SetFieldType( CFieldExchange::outputParam );
  RFX_Long( pFX, "Param1", m_nOutParamInstructorCount );
  // 在此“Param1”名字是一个从未使用过的假名。
  pFX->SetFieldType( CFieldExchange::inputParam );
  RFX_Text( pFX, "Param2", m_strInParamName );
  // 在此“Param2”名字是一个从未使用过的假名。
}
// 现在实现COurParamRecordset。
// 假定db是一个已经打开的数据库对象。
COutParamRecordset rs( &db );
rs.m_strInParamName = _T("Some_Input_Param_Value");
// 获取第一个结果集
// 注意:对于返回多行集合的存储过程来说,SQL Server需要只能前进类型的游标。
// 过程
rs.Open( CRecordset::forwardOnly, "{? = CALL GetCourses( ? )}", CRecordset::readOnly);
// 在第一个结果集中循环通过所有的数据
while ( !rs.IsEOF( ) )
{
  CString strFieldValue;
  for( int nIndex = 0; nIndex < rs.GetODBCFieldCount( ); nIndex++ )
  {
    rs.GetFieldValue( nIndex, strFieldValue );
    // TO DO: Use field value string.
  }
  rs.MoveNext();
}
// 获取其它的结果集...
while( rs.FlushResultSet( ) )
{
  // 由于游标无效,必须定义MoveNext
  rs.MoveNext( );
  while ( !rs.IsEOF() )
  {
    CString strFieldValue;
    for( int nIndex = 0; nIndex < rs.GetODBCFieldCount( ); nIndex++ )
    {
      rs.GetFieldValue( nIndex, strFieldValue );
      // TO DO: 使用的字段值字符串。
    }
    rs.MoveNext( );
  }
}
// 所有的结果集都满了。不能使用该游标了,但是已经写入了输出参数m_nOutParamInstructorCount。
// 注意,要直到CRecordset::FlushResultSet返回FALSE,这表明不会再返回更多的结果集,这时m_nOutParamInstructorCount才无效。
// TO DO: 使用m_nOutParamInstructorCount
// 清除
rs.Close( );
db.Close( );

请参阅:CFieldExchange::SetFieldType