Ocasionalmente, tuve que crear una cadena SQL en VBA y ejecutarla con Docmd.RunSql()
. Siempre he incorporado estas cadenas mediante la concatenación de las variables en la cadena, por ejemplo:Creación de cadenas SQL en Access/VBA
Dim mysqlstring as String
mysqlstring = "INSERT INTO MyTable (Field1, Field2, Field3 ...) VALUES ("
mysqlstring = mysqlstring + Me.TextMyField1 + ", " 'parameter comments
mysqlstring = mysqlstring + Me.TextMyField2 + ", "
mysqlstring = mysqlstring + Me.TextMyField3 + ", "
...
mysqlstring = mysqlstring + ");"
Docmd.RunSql mysqlstring
VBA no parecen tener un operador de concatenación unario (como + =) y mientras esto no se ve ideales, al menos yo puedo comentar cada uno de mis parámetros y cambiarlos de forma independiente. Hace que sea más fácil leer y cambiar que una cadena concatenada de un monstruo. Pero todavía parece una forma terrible de construir cadenas de SQL. Tengo uno con aproximadamente 50 parámetros en el trabajo, entonces 50 líneas de mysqlstring = mysqlstring +...
. No es lindo.
Dicho sea de paso, eso descarta el uso de continuación de línea para formatear la cadena, ya que hay un limit on the number of line-continuations you can use on a single string (sugerencia: menos de 50). Además, VBA no te deja poner un comentario después de la continuación de la línea, grr!
Hasta hace poco, pensaba que esta era la única forma de construir estas cadenas. Pero recientemente he visto un patrón diferente, inyectando los parámetros en la cadena como this question (VB.NET) en el que publiqué una respuesta, y me pregunté si habría un equivalente de Parameters.AddWithValue()
para VBA, o si eso sería incluso mejor que el enfoque de concatenación de cadenas . Así que pensé que esto merece su propia pregunta. Tal vez hay algo que me falta aquí.
¿Pueden algunos de los expertos de Access aclarar cuáles son las mejores prácticas para crear cadenas de SQL en Access/VBA.
Si usa CurrentDB, en lugar de asignar CurrentDB a una variable, no puede devolver los registros afectados. – Fionnuala
Cierto, me olvido de ese detalle. Tengo un fragmento de código para manejar esa situación. –
Y no puede usar SELECT @IDENTITY para obtener el PK de Autonumérico de la última inserción. –