Cómo realizar transacciones con las clases de base de datos MFC

Seleccione idioma Seleccione idioma
Id. de artículo: 128208 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo describe temas relacionados con las transacciones de base de datos MFC. Material aquí es una aclaración y expansión de la documentación existente. Otro material describe el comportamiento específico de la transacción del controlador ODBC de Microsoft Access versión 2.0.

A partir de Microsoft Visual C++ versión 4.2, consulte las siguientes dos C++ técnico notas Visual para obtener información sobre realizar transacciones mediante las clases de base de datos de MFC: TN047 (relajación requisitos de transacción de base de datos) y TN068 (realizar transacciones con el controlador ODBC de Microsoft Access 7).

Más información

Transacciones de base de datos MFC

MFC expone las transacciones de base de datos a través de tres funciones miembro de clase CDatabase, BeginTrans(), CommitTrans() y Rollback(). Hay una variable miembro, m_bTransactions, que indica si el controlador proporciona las capacidades que requieren de modelo del MFC de transacciones. Estas capacidades se comprueban en función de miembro CDatabase::Open(). CDatabase::CanTransact() se puede llamar para recuperar el estado de esa variable miembro.

Un requisito principal para el modelo de transacción de MFC es que el controlador admite la conservación del cursor a través de confirmaciones de transacciones y deshacer. Este requisito prohíbe la compatibilidad con transacciones cuando se utiliza la mayoría de los controladores ODBC. Ninguno de los controladores enviados por Microsoft a fecha cumple este requisito.

Sin embargo, hay una forma, para utilizar transacciones con algunos controladores ODBC que proporcionan un menor grado de compatibilidad con transacciones que lo que es requerido por el modelo MFC. Los pasos necesarios para obtener esta compatibilidad son:

  1. El controlador de capacidades de consulta.
  2. Establezca manualmente la variable de miembro de m_bTransactions.
  3. Cerrar o eliminar el cursor después de finalizar la transacción.
En las secciones siguientes se describen estos tres pasos detalladamente.

Paso 1 - consultar el controlador de funciones

Una aplicación debe comprobar dos elementos para determinar si es capaz de utilizar transacciones, como se describe en este artículo. Son el comportamiento de cursor y la compatibilidad con la transacción. No hay llamadas a API de ODBC que deben utilizarse para realizar esta comprobación. Para comprobar la compatibilidad con transacciones, una aplicación debe llamar a SQLGetInfo() con el indicador SQL_TXN_CAPABLE. Si SQLGetInfo() devuelve SQL_TC_NONE, las transacciones no son compatibles en modo alguno con el controlador y la aplicación no podrán utilizar transacciones con ese controlador. Para obtener más información acerca de esto, vea la documentación para SQLGetInfo() en referencia del programador de versión 2.0 de ODBC.

Después de determinar que el controlador admite transacciones, la aplicación debe determinar el comportamiento de cursor en confirmar y deshacer. Estas capacidades pueden determinarse llamando a la función SQLGetInfo() y especificando SQL_CURSOR_COMMIT_BEHAVIOR y SQL_CURSOR_ROLLBACK_BEHAVIOR, respectivamente. MFC llama a estas funciones al comprobar la funcionalidad del controlador en la función CDatabase::Open(). En MFC versión 3.0 y posteriores, los resultados de estas llamadas de función se almacenan en el m_nCursorCommitBehavior de variables de miembro de CDatabase y m_nCursorRollbackBehavior. En versiones anteriores de MFC, estas variables no existen, pero la aplicación puede hacer la SQLGetInfo() llama a sí mismo para determinar el comportamiento del cursor.

La confirmación de cursor y el cursor deshacer comportamiento determinará cómo tratar la CRecordset finalice la transacción. La siguiente muestra los posibles valores devueltos y lo que significan:
Return Value      Meaning
--------------------------------------------------------
SQL_ERROR         Transactions not supported.

SQL_CB_DELETE     CRecordset::Close() must be called
                  following commit or rollback.

SQL_CB_CLOSE      CRecordset::Requery() must be called
                  following commit or rollback.

SQL_CB_PRESERVE   No special actions need to be taken.
                  (m_bTransactions will be TRUE for a
                  driver that returns this value.)
				
comportamiento del cursor determinar qué se necesita en el paso 3.

Paso 2 - establecer manualmente la variable miembro m_bTransactions

La variable de miembro m_bTransactions de CDatabase está protegida. A causa de esto, debe derivar una clase de CDatabase para poder cambiar su valor. Ésta es una forma de hacerlo:
   class CMyDatabase : public CDatabase {

   public:
      void SetTransactions() { m_bTransactions = TRUE; }
   };
				
llamar ahora, a SetTransactions() en su objeto CMyDatabase para cambiar el miembro m_bTransactions en TRUE y permitir transacciones en la base de datos después de asegurarse de que se admiten transacciones.

Paso 3: cerrar o eliminar el cursor después de finalizar la transacción

Según el comportamiento de cursor determinado en el paso 1, debe ser Close() el conjunto de registros si el comportamiento del cursor es SQL_CB_DELETE o Requery() el conjunto de registros si el comportamiento del cursor es SQL_CB_CLOSE--después de la transacción se realiza.

Una consideración adicional al utilizar el controlador de ODBC 2.0 de Microsoft Access



Cuando se utiliza Microsoft Access versión 2.0 o controlador ODBC 3.0, que utiliza el motor de base de datos Microsoft Jet de Access, debe tener en también cuenta para el requisito del motor de base de datos Jet que no se puede iniciar una transacción en cualquier base de datos que tiene un cursor abierto. En la clase MFC CRecordset, un cursor abierto significa un resultado pendiente establecer.

Éstas son dos maneras de controlar esta situación:

  • Asegúrese de que el conjunto de registros está cerrado cuando se inicia una transacción, abrir el conjunto de registros después de llamar a función miembro de la base de datos BeginTrans() y cerrar el conjunto de registros inmediatamente después de finalizar la transacción. Si está realizando varias transacciones, la apertura de varias y cierre del conjunto de registros puede afectar negativamente afectará al rendimiento de la aplicación.

    -o bien -
  • Utilice la función API de ODBC SQLFreeStmt() cerrar explícitamente el cursor después de finalizar una transacción y, a continuación, llamar a Requery() después de iniciar la transacción siguiente. Cuando se llama a SQLFreeStmt(), especificar HSTMT del conjunto de registros como el primer parámetro y SQL_CLOSE como segundo parámetro. Esta segunda técnica es más rápido que cerrar y abrir el conjunto de registros del principio de cada transacción. El fragmento de código siguiente muestra esta técnica cuando se realiza dos transacciones:
       CMyDatabase   db;
       db.Open("MY_DATASOURCE");
       CMyRecordset  rs(&db);
    
       db.BeginTrans();                       // start transaction 1
       rs.Open();                             // open the recordset
    
       // manipulate data
    
       db.CommitTrans();                      // or Rollback()
    
       ::SQLFreeStmt(rs.m_hstmt,SQL_CLOSE);   // close the cursor
       db.BeginTrans();                       // start transaction 2
       rs.Requery();                          // now get the result set
    
       // manipulate data
    
       db.CommitTrans();                      // end transaction 2
    
       rs.Close();
       db.Close();

Referencias

Nota técnica MFC nº 47: "Relajación requisitos de transacción de base de datos".

Los siguientes artículos de enciclopedia MFC:

  • "Transacción"
  • "Transacción: realizar una transacción en un conjunto de registros"
  • "Transacción: cómo afectan las transacciones a las actualizaciones"
CDatabase y CRecordset secciones de la referencia de biblioteca de clases de MFC.

ODBC 2.0 del manual del programador.

Propiedades

Id. de artículo: 128208 - Última revisión: jueves, 23 de enero de 2014 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.51
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional
Palabras clave: 
kbnosurvey kbarchive kbmt kbcode kbdatabase kbhowto kbprogramming KB128208 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 128208

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com