Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se explica cómo realizar una transacción en un conjunto de registros.
Nota:
Solo se admite un nivel de transacciones; no se pueden anidar transacciones.
Para realizar una transacción en un conjunto de registros
Llame a la función miembro
CDatabasedel objetoBeginTrans.Si no ha implementado la captura masiva de filas, llame a las funciones miembro
AddNew/Update,Edit/UpdateyDeletede uno o varios objetos de conjunto de registros de la misma base de datos tantas veces como sea necesario. Para obtener más información, vea Conjunto de registros: agregar, actualizar y eliminar registros (ODBC). Si ha implementado la captura masiva de filas, debe escribir sus propias funciones para actualizar el origen de datos.Por último, llame a la función miembro
CDatabasedel objetoCommitTrans. Si se produce un error en una de las actualizaciones o decide cancelar los cambios, llame a su función miembroRollback.
En el ejemplo siguiente se usan dos conjuntos de registros para eliminar la inscripción de un alumno de una base de datos de registro escolar, quitando al alumno de todas las clases en las que está inscrito. Dado que las llamadas a Delete de ambos conjuntos de registros deben realizarse correctamente, se requiere una transacción. En el ejemplo se da por sentada la existencia de m_dbStudentReg, una variable miembro de tipo CDatabase que ya está conectada al origen de datos, y las clases CEnrollmentSet y CStudentSet del conjunto de registros. La variable strStudentID contiene un valor obtenido del usuario.
BOOL CEnrollDoc::RemoveStudent( CString strStudentID )
{
// remove student from all the classes
// the student is enrolled in
if ( !m_dbStudentReg.BeginTrans( ) )
return FALSE;
CEnrollmentSet rsEnrollmentSet(&m_dbStudentReg);
rsEnrollmentSet.m_strFilter = "StudentID = " + strStudentID;
if ( !rsEnrollmentSet.Open(CRecordset::dynaset) )
return FALSE;
CStudentSet rsStudentSet(&m_dbStudentReg);
rsStudentSet.m_strFilter = "StudentID = " + strStudentID;
if ( !rsStudentSet.Open(CRecordset::dynaset) )
return FALSE;
TRY
{
while ( !rsEnrollmentSet.IsEOF( ) )
{
rsEnrollmentSet.Delete( );
rsEnrollmentSet.MoveNext( );
}
// delete the student record
rsStudentSet.Delete( );
m_dbStudentReg.CommitTrans( );
}
CATCH_ALL(e)
{
m_dbStudentReg.Rollback( );
return FALSE;
}
END_CATCH_ALL
rsEnrollmentSet.Close( );
rsStudentSet.Close( );
return TRUE;
}
Nota:
Es un error llamar de nuevo a BeginTrans sin llamar a CommitTrans o Rollback.
Consulte también
Transacción (ODBC)
Transacción: Cómo afectan las transacciones a las actualizaciones (ODBC)
CDatabase (clase)
CRecordset (clase)