[Pgsql-ayuda] ONWER DE LA LISTA (ademá s Problema con Delphi,ADO,ODBC)

Alvaro Herrera alvherre@dcc.uchile.cl
Fri, 7 Nov 2003 09:46:45 -0300


Alguien puede ayudar a David?  Yo en este tema no tengo idea.

También sería bueno que alguno de los administradores de la lista le
echara un vistazo a por qué el sistema está dando problemas.  No es el
único que ha dicho que los mails quedan almacenados sin envío ...

Sobre el problema en particular, lo único que puedo decir es que si tu
lenguaje de programación se comporta de manera tan estúpida, lo más sano
es botarlo y usar algo decente.

----- Forwarded message from David Prieto <davidp@sgth.es> -----

From: "David Prieto" <davidp@sgth.es>
To: <alvherre@dcc.uchile.cl>
Subject: [pgsql-ayuda] Problema con Delphi,ADO,ODBC
Date: Fri, 7 Nov 2003 09:05:21 +0100
X-Mailer: Microsoft Outlook, Build 10.0.2627
X-BayesSpamScore: 0


Hola, Alvaro.

	Perdona que te escriba directamente, pero estoy intentando
enviar un correo a la lista de psql-ayuda y me viene un correo diciendo
que estoy enviando unas cabeceras extrañas y que ya el administrador
decidirá si publica o no el mensaje, y recibiré un correo con su
decisión. El tema es que esto fue hace dos semanas, y el administrador
todavía no ha decidido. Envié otra copia, y el mismo resultado.

	Por favor, si puedes publicarlo tú, te lo agradecería. (o si
sabes directamente responderme al problema que tengo, claro)

	Muchas gracias.

----------------------------

Hola.

	Estoy accediendo a PostgreSQL desde Delphi+ADO+ODBC.

	Para consultas que devuelven registros uso un objeto ADOQuery, y
para consultas tipo "insert/update", uso un objeto ADOCommand.

	El problema que tengo es que si hago algo como lo siguiente
(pongo un medio-seudocódigo):

begin transaction
 objetoCommand.CommandText:="insert into….."
 try
   objetoCommand.Execute
 except
   mensaje ("Se ha producido un error al hacer el insert. Abortando la
transaccion")
   rollback
   exit
 end
 objetoCommand.CommandText:="update…."
 try
   objetoCommand.Execute
 except
   mensaje ("Se ha producido un error al hacer el update. Abortando la
transaccion")
   rollback
   exit
 end
end transaction

	(es decir, si modifico la sentencia SQL que va a ejecutar el
objeto ADOCommand, dentro de la transacción), 

	Entonces veo que el programa se ejecuta perfectamente. No se
produce (al menos, el driver no informa de) ningún error, sin embargo,
el comando "insert into…" no ha insertado nada en la tabla.

	Es más: si la tabla tiene un campo "serial", resulta que el nº
de secuencia SI se está incrementando, con lo que al menos veo que el
"insert…" ha llegado a PostgreSQL y lo ha ejecutado. Sin embargo, en la
tabla no ha quedado ningún registro nuevo. Pero lo peor es que el
"update" (la segunda sentencia SQL) sí que se ha ejecutado...

	He configurado PostgreSQL para que mande al log todas las
sentencias SQL que recibe. Esto es lo que encuentro:

Oct 22 00:19:11 vserver postgres[1579]: [53] LOG:  query: SELECT INVALID
SELECT
STATEMENT TO FORCE ODBC DRIVER TO UNPREPARED STATE
Oct 22 00:19:11 vserver postgres[1579]: [54] ERROR:  parser: parse error
at or n
ear "SELECT" at character 16
Oct 22 00:19:11 vserver postgres[1579]: [55] LOG:  query: ROLLBACK

	Por lo que veo, "alguien" (el driver ODBC o el ADO) está
enviando al PostgreSQL la sentencia "SELECT INVALID SELECT
STATEMENT TO FORCE ODBC DRIVER TO UNPREPARED STATE", y luego un
"ROLLBACK" cada vez que cambio la sentencia a ejecutar, lo que provoca
un error, y un "rollback" de la transacción.

	Lo que he tenido que hacer para evitar esto es crear distintos
objetos "ADOCommand": uno para cada sentencia que vaya a enviar al
PostgreSQL, y asignar las sentencias SQL de cada uno ANTES de entrar en
la transacción. Pero claro…. Ahora no estoy seguro de que en alguna
parte de la aplicación se me haya quedado alguno sin cambiar. Por otra
parte, esto me va a cortar muchas posibilidades, al no poder asignar la
sentencia dentro de una función que se ejecute dentro una transacción…
Por otra parte, como durante la ejecución no se produce ningún error, no
puedo estar seguro de que la información que se guarda en la tabla sea
consistente…

	¿Alguna solución?

Un saludo,
  David Prieto. 



----- End forwarded message -----

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
www.google.com: interfaz de línea de comando para la web.