CRecordset::FlushResultSet

BOOL FlushResultSet () const ;
jeter (CDBException);

Valeur de retour

Différent de zéro si il y a plusieurs jeux de résultats à récupérer ; sinon 0.

Remarques

Appelez cette fonction membre pour récupérer le prochain jeu de résultats d'une requête prédéfinie (procédure stockée), s'il y a plusieurs jeux de résultats. Vous devez appeler FlushResultSet uniquement lorsque vous avez complètement terminé avec le curseur sur le jeu de résultats actuel. Notez que lorsque vous récupérez le résultat suivant en appelant FlushResultSet, votre curseur n'est pas valide sur ce que l'ensemble des résultats ; vous devez appeler la fonction membre MoveNext après l'appel de FlushResultSet.

Si une requête prédéfinie utilise un paramètre de sortie ou de paramètres d'entrée/sortie, vous devez appeler FlushResultSet jusqu'à ce qu'elle renvoie FALSE (la valeur 0), afin d'obtenir les valeurs de paramètre.

FlushResultSet appelle la fonction API ODBC SQLMoreResults. Si SQLMoreResults retourne SQL_ERROR ou SQL_INVALID_HANDLE, FlushResultSet lèvera une exception. Pour plus d'informations sur SQLMoreResults, voir la référence du programmeur ODBC SDK.

Exemple

Le code suivant suppose que COutParamRecordset est un objet CRecordset-objet dérivé basé sur une requête prédéfinie avec un paramètre d'entrée et un paramètre de sortie et avoir plusieurs jeux de résultats. Note de la structure de la DoFieldExchange substituer.

// 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 COutParamRecordset::DoFieldExchange( CFieldExchange* pFX )
{
   pFX->SetFieldType( CFieldExchange::outputParam );
   RFX_Long( pFX, "Param1", m_nOutParamInstructorCount );
         // The "Param1" name here is a dummy name 
         // that is never used

   pFX->SetFieldType( CFieldExchange::inputParam );
   RFX_Text( pFX, "Param2", m_strInParamName );
         // The "Param2" name here is a dummy name 
         // that is never used

}


// Now implement COurParamRecordset.

// Assume db is an already open CDatabase object
COutParamRecordset rs( &db );
rs.m_strInParamName = _T("Some_Input_Param_Value");

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

// Loop through all the data in the first result set
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( );
}

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

   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( );
   }
}


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

// TO DO: Use m_nOutParamInstructorCount

// Cleanup
rs.Close( );
db.Close( );

Aperçu de CRecordset |  ; Membres de la classe | Graphique de la hiérarchie

Voir aussi  ;CFieldExchange::SetFieldType

Index