Compartir a través de


CRecordset::FlushResultSet

 

Recupera el conjunto de resultados siguiente de una consulta predefinida (procedimiento almacenado), si hay conjuntos de resultados múltiples.

Sintaxis

BOOL FlushResultSet( );

Valor devuelto

Distinto de cero si hay más conjuntos de resultados que se recuperarán; si no 0.

Comentarios

Debe llamar a FlushResultSet cuando termine completamente con el cursor en el conjunto de resultados actual.  Tenga en cuenta que cuando se recupera el conjunto de resultados siguiente llamando a FlushResultSet, el cursor no es válido en ese conjunto de resultados; se debe llamar a la función miembro de MoveNext después de llamar a FlushResultSet.  

Si una consulta predefinida utiliza un parámetro de salida o parámetros de entrada y salida, debe llamar a FlushResultSet hasta que devuelve FALSE (valor 0), para obtener estos valores de parámetro.

FlushResultSet llama a la función API SQLMoreResultsde ODBC.  Si SQLMoreResults devuelve SQL_ERROR o SQL_INVALID_HANDLE, después FlushResultSet producirá una excepción.  Para obtener más información sobre SQLMoreResults, vea Windows SDK.  

El procedimiento almacenado debe haber enlazado campos si desea llamar FlushResultSet.

Excepciones

Exception

Condition

Este método puede producir excepciones de **CDBException***escrito.

Ejemplo

El código siguiente supone que COutParamRecordset es CRecordset- objeto derivado basado en una consulta predefinida con un parámetro de entrada y un parámetro de salida, y tiene conjuntos de resultados múltiples.  Observe la estructura de reemplazo de 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();

Requisitos

encabezado: afxdb.h

Vea también

CRecordset Class
Gráfico de jerarquías
CFieldExchange::SetFieldType