Hay varias preguntas en StackOverflow que parecen tener respuestas que se contradicen entre sí sobre el tema de ADO/OleDB, delphi TADOQuery/TADOCommand y el tema de los parámetros.¿Los componentes ADO, especialmente TADOCommand, funcionan de manera más fiable con parámetros sin nombre o con nombre, en algunos casos?
Los parámetros se pueden introducir de dos maneras, en las propiedades CommandText o SQL de un componente ADO. Los parámetros con nombre, que trabajan la mayoría de las veces para mí, se introducen con dos puntos:
select a, b, c from bar where bat = :baz
Esto funciona, el 99% de las veces para mí, muy bien. De vez en cuando me parece que ADO o envoltorios de Delphi a su alrededor, no aceptarán ": Baz" y requiere que escribo esto en su lugar:
select f, g, h from bar where bat = ?
Esto se traduce en un parámetro sin nombre, en lugar de un parámetro con nombre. Cuando un comando ADO Query o ADO contiene solo un parámetro, esto no es un gran problema. Pero eso no es cuando ADO se porta conmigo. Ayer actuó de una manera, y hoy en día, de una manera diferente con un doble mando en un solo objeto TADOCommand, así, con dos comandos en cadena de un CommandText:
delete from bar where id = :id1
delete from bat where id = :id2
tuve que cambiarlo a esto:
delete from bar where id = ?
delete from bat where id = ?
Funcionó todo el día de ayer. Hoy tuve que cambiarlo a la primera versión para que funcione. El síntoma era que los parámetros de ADO desaparecían y no regresaban, y cuando intento ejecutar el comando obtengo un error, índice fuera de rango, cuando intento acceder al Parameters[0]
. Nada me da ninguna advertencia de que los parámetros están desapareciendo. Parece que unas pocas conexiones al conjunto de datos ADO, en designtime, activan el componente TADOCommand
, en particular, y "simplemente me rompe". Es particularmente enloquecedor cuando intentas escribir una consulta o un comando, y sabes que funciona, pero el componente ADO ha decidido no aceptar "?" o ": x" en este momento. Puede evitar su incapacidad total para funcionar cambiando de una a la otra. Pero me frustra, y probablemente bloquea completamente a otras personas. Sé que algunas personas siempre construyen dinámicamente su SQL en código, y evitan usar Parameters
, y quizás por eso.
posibles respuestas a la pregunta que yo estoy anticipando son:
ADO no admite varios comandos, o al menos envoltorios de Delphi no lo hacen. O tal vez
TADOCommand
simplemente no funciona de manera confiable aquí.Los parámetros son un área defectuosa en todos los ADO, o en todos los envoltorios ADO de Delphi?
Lo estás haciendo mal.
Estoy usando Delphi XE2, pero he visto un comportamiento igualmente dudoso en 2007, 2009, 2010 y XE. Estoy usando Proveedor OLEDB de Microsoft para SQL Server como mi Proveedor OLEDB.
¿Hace una diferencia si separa los dos comandos con (para SQL Server) un punto y coma? –
En proyectos que no necesitan controles de datos, he cambiado el uso de ADODB y ADOInt directamente algunas veces. Me gusta aquí: http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/demo2/03%20Data/xxmData.pas?view=markup No he comprobado qué hace esto por el rendimiento, pero realmente debería verifique uno de estos días (y publique mis resultados aquí como respuesta) ... –
SilentD: Voy a probar el punto y coma. Mi recuerdo es que los componentes de Delphi ado tampoco son compatibles con los separadores. –