Hace un tiempo consulté acá y en varios foros sobre la manera correcta de usar las transacciones desde VFP contra SQL Server. Si bien muchos me dieron pautas, se me daba un problema que no tenía ninguna lógica.

Hasta que hoy, después de hacer enésimas pruebas, encontré la solución.

El tema pasa por esto:

Yo utilizo cursor adapters para manejar el acceso a datos remotos, via ODBC
Con ODBC es más fácil y requiere menos programación, bastante útil si no se trabaja en capas y solamente se trabaja en una LAN.

Toda la literatura consultada y los consejos recibidos me indican que se debe poner las transacciones en MANUAL, grabar en las diferentes tablas y luego volver a ponerlas en AUTOMATICO. Y leyuendo la literatura se entiende bien por qué.

Siguiendo ejemplos de libros y white papers yo hacía esto:

#define DB_TRANSMANUAL      2
#define DB_TRANSAUTO            1


sqlexec(nHandle, 'BEGIN TRANSACTION')

SQLSetProp(nHandle, "TRANSACTIONS", DB_TRANSMANUAL)

*** grabar las distintas tablas y luego


SQLSetProp(nHandle, "TRANSACTIONS", DB_TRANSAUTO)

Sin embargo, haciendo pruebas en las que a propósito introducía un error, la cosa no funcionaba. Se grababan las tablas anteriores al error y las tablas posteriores al mismo no. Lo cual hacía bastante insegura la rutina e inútil todo el cuidado en programar las transacciones.

Hoy se me ocurrieron dos cosas:

a) en los cursor adapters poner la propiedad USETRANSACTIONS en .F., para que el CA no maneje las transacciones en forma automática. b) en lugar de usar las variables precompiladas con define, como se ve arriba, mandar directamente los números 2 para hacerlas manuales y 1 para volverlas a automáticas.

O sea: SQLSetProp(nHandle, "TRANSACTIONS",2) y SQLSetProp(nHandle, "TRANSACTIONS",1)

Y por supuesto, asi, funcionó. Y aclaro que con SPT la cosa era igual y se solucionó también.

El primer caso es porque no hice antes lo que tendría que haber hecho desde el principio (en inglés se dice RTFM -read the f...g manual)

Pero lo del segundo caso, eso de usar los números en lugar de las variables precompiladas, me deja perplejo. ¿será quizás un tema del driver ODBC? Yo uso Windows 7 Ultimate y SQL Server 2008 Express RS 2

Si alguien tiene alguna respuesta, idea o precisa, se lo voy a agradecer.

Rafael Copquin



Responder a