Conjunto de registros: Información adicional sobre las actualizaciones (ODBC)

Este tema es aplicable a las clases ODBC de MFC.

En este tema se explica:

Nota:

Este tema se aplica a objetos derivados de CRecordset donde no se haya implementado la extracción masiva de filas. Si ha implementado la obtención masiva de filas, parte de esta información será irrelevante. Por ejemplo, no podrá llamar a las funciones miembro AddNew, Edit, Delete ni Update, pero sí realizar transacciones. Para más información sobre la recuperación masiva de filas, vea Recordset: recuperar registros en bloque (ODBC).

Cómo otras operaciones afectan a las actualizaciones

Las actualizaciones se ven afectadas por las transacciones en vigor en el momento de la actualización, por cerrar el conjunto de registros antes de que una transacción se complete y por desplazarse antes de que una transacción se complete.

Cómo afectan las transacciones a las actualizaciones

Aparte de comprender cómo funcionan AddNew, Edit y Delete, también es importante saber cómo funcionan las funciones miembro BeginTrans, CommitTrans y Rollback de CDatabase con las funciones de actualización de CRecordset.

De forma predeterminada, las llamadas a AddNew y a Edit afectan inmediatamente al origen de datos cuando se llama a Update. Las llamadas a Delete surten un efecto inmediato. Con todo, se puede definir una transacción y ejecutar un lote de este tipo de llamadas. Las actualizaciones no son permanentes hasta que se confirman. Si cambias de opinión, la transacción se puede revertir en lugar de hacerla efectiva.

Para obtener más información sobre las transacciones, vea Transacción (ODBC).

Cómo afecta el cierre del conjunto de registros a las actualizaciones

Si se cierra un conjunto de registros, o su objeto CDatabase asociado, habiendo una transacción en curso (no se ha llamado a CDatabase::CommitTrans ni a CDatabase::Rollback), la transacción se revierte automáticamente (a menos que el back-end de la base de datos sea el motor de base de datos Microsoft Jet).

Precaución

Si se usa el motor de base de datos Microsoft Jet, cerrar un conjunto de registros dentro de una transacción explícita no hace que se libere ninguna de las filas modificadas ni ningún bloqueo existente hasta que esa transacción explícita se confirme o revierta. Se recomienda abrir y cerrar los conjuntos de registros siempre dentro o fuera de una transacción Jet explícita.

Cómo afecta el desplazamiento a las actualizaciones

Si realiza un desplazamiento en un conjunto de registros (ODBC), el búfer de edición se rellena con cada nuevo registro actual (el registro anterior no se almacena primero). El desplazamiento omite los registros eliminados anteriormente. Si te desplazas después de una llamada a AddNew o Edit sin haber llamado previamente a Update, CommitTrans o Rollback, los cambios se pierden (sin ninguna advertencia), ya que un nuevo registro se carga en el búfer de edición. El búfer de edición se llena con el registro al que se ha desplazado, el registro previamente almacenado se libera y no se realiza ningún cambio en el origen de datos. Esto se aplica a AddNew y Edit.

Las actualizaciones propias y las de otros usuarios

Cuando se usa un conjunto de registros para actualizar datos, las actualizaciones propias afectan a otros usuarios. Del mismo modo, las actualizaciones de otros usuarios durante la vigencia del conjunto de registros le afectan.

En un entorno multiusuario, otros usuarios pueden abrir conjuntos de registros que contengan algunos de los mismos registros que haya seleccionado para su conjunto de registros. Los cambios en un registro antes de recuperarlo se reflejan en su conjunto de registros. Los conjuntos de registros dinámicos recuperan un registro cada vez que se desplace a dicho registro, por eso los conjuntos dinámicos reflejan los cambios cada vez que se desplace a un registro. Las instantáneas recuperan un registro la primera vez que se desplaza por él, por lo tanto, las instantáneas solo reflejan los cambios que se producen antes de desplazarse inicialmente al registro.

Los registros agregados por otros usuarios después de abrir el conjunto de registros no se muestran en su conjunto de registros, a menos que realice una nueva consulta. Si el conjunto de registros es un conjunto dinámico, los cambios que otros usuarios realicen en los registros existentes se muestran en su conjunto dinámico al desplazarse al registro afectado. Si el conjunto de registros es una instantánea, las modificaciones no se muestran hasta que realice una nueva consulta de la instantánea. Si quiere que su instantánea refleje los registros agregados o eliminados por otros usuarios, o que su conjunto dinámico refleje los registros agregados por otros usuarios, llame a CRecordset::Requery para volver a generar el conjunto de registros. (Tenga en cuenta que las eliminaciones hechas por otros usuarios aparecen reflejadas en su conjunto de datos dinámico). También puede llamar a Requery para ver los registros que haya agregado, pero no para ver sus eliminaciones.

Sugerencia

Para forzar el almacenamiento en caché de una instantánea completa de una vez, llame a MoveLast inmediatamente después de abrir la instantánea. A continuación, llame a MoveFirst para empezar a trabajar con los registros. MoveLast equivale a desplazarse por todos los registros, pero los recupera todos a la vez. Recuerde no obstante que esto puede reducir el rendimiento y que posiblemente no sea necesario para algunos controladores.

Los efectos de las actualizaciones en otros usuarios son similares a los efectos de ellos sobre usted.

Más información sobre Update y Delete

En esta sección se proporciona más información para ayudarle a trabajar con Update y Delete.

Actualización: Éxito y Fallo

Si Update se ejecuta correctamente, el modo AddNew o Edit finaliza. Para volver a iniciar un modo AddNew o Edit, llame a AddNew o a Edit.

Si Update genera un error (devuelve FALSE o produce una excepción), el usuario permanecerá en el modo AddNew o Edit, dependiendo de la función a la que llamó por última vez. y podrá realizar una de las siguientes acciones:

  • Modifique un miembro de datos de un campo y vuelva a intentar Update.

  • Llama a AddNew para restablecer los campos de datos a Null, asignar los valores a los campos de datos, y después volver a llamar a Update.

  • Llamar a Edit para volver a cargar los valores que había en el conjunto de registros antes de la primera llamada a AddNew o a Edit, establecer los valores de los miembros de datos de campo y volver a llamar a Update. Después de una llamada a Update exitosa (excepto después de una llamada a AddNew), los campos de datos conservan sus nuevos valores.

  • Llamar a Move (incluido Move con un parámetro AFX_MOVE_REFRESH o 0), lo que vacía cualquier cambio y finaliza el modo AddNew o Edit en vigor.

Actualizar y Eliminar

Esta sección es válida tanto para Update como para Delete.

En una operación Update o Delete, se debe actualizar solamente un único registro. Ese registro es el registro actual, que corresponde a los valores de datos de los campos del conjunto de registros. Si, por alguna razón, ningún registro se ve afectado o más de un registro se ve afectado, se produce una excepción que contiene uno de los siguientes valores RETCODE:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED

Si se producen estas excepciones, el usuario permanecerá en el estado AddNew o Edit en el que estaba cuando llamó a Update o a Delete. Estos son los escenarios más comunes en los que estas excepciones pueden darse. Lo más probable es ver:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED cuando está usando el modo de bloqueo optimista y otro usuario ha modificado el registro de tal manera que impide que el framework identifique el registro correcto que debe actualizar o eliminar.

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED si la tabla que está actualizando no tiene ninguna clave principal o índice único, y no hay suficientes columnas en el conjunto de registros para identificar una fila de tabla de forma única.

Consulte también

Conjunto de registros (ODBC)
Conjunto de registros: Cómo los conjuntos de registros seleccionan registros (ODBC)
Intercambio de campos de registros (RFX)
SQL
Excepciones: Excepciones de base de datos