CRecordset::FlushResultSet

BOOL FlushResultSet () const;
werfen (CDBException);

Rückgabewert

Ungleich NULL, wenn mehr Resultsets abgerufen werden; andernfalls 0.

Bemerkungen

Rufen Sie diese Memberfunktion um eine vordefinierte Abfrage (gespeicherte Prozedur), die nächste Ergebnismenge abzurufen, wenn es mehrere Resultsets gibt. Nur, wenn Sie den Cursor auf das aktuelle Resultset vollständig abgeschlossen haben, sollten Sie FlushResultSet aufrufen. Beachten Sie, dass beim Abrufen des nächsten Resultsets durch Aufrufen von FlushResultSetSie den Cursor auf nicht gültig ist, dass die Ergebnismenge; Sie sollten die MoveNext -Memberfunktion aufrufen, nach dem Aufruf von FlushResultSet.

Wenn eine vordefinierte Abfrage ein Output-Parameter oder Input/Output-Parameter verwendet, müssen Sie FlushResultSet aufrufen, bis es falsch (Wert 0), zurückgibt, um diese Werte zu erhalten.

FlushResultSet Ruft die ODBC-API-Funktion SQLMoreResults. Wenn SQLMoreResults gibt SQL_ERROR oder SQL_INVALID_HANDLEzurück, wird FlushResultSet eine Ausnahme ausgelöst. Weitere Informationen über SQLMoreResultsfinden Sie in der ODBC SDK Programmer's Reference.

Beispiel

Der folgende Code wird davon ausgegangen, dass COutParamRecordset ist ein CRecordset-abgeleitete Objekt basierend auf einer vordefinierten Abfrage mit einem Eingabeparameter und einen Ausgabeparameter und haben mehrere Resultsets. Hinweis Die Struktur der DoFieldExchange überschreiben.

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

CRecordset ÜbersichtMember der Klasse | Hierarchiediagramm

Siehe auch&Nbsp;CFieldExchange:: SetFieldType

Index