Occasionalmente, ho dovuto creare una stringa SQL in VBA ed eseguirla con Docmd.RunSql()
. Ho sempre costruito queste stringhe concatenando le variabili nella stringa, ad esempio:Creazione di stringhe SQL in 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 non sembra avere un operatore di concatenazione unario (come + =) e mentre questo non sembra l'ideale, almeno io può commentare ciascuno dei miei parametri e modificarli in modo indipendente. Rende più facile leggere e modificare di una stringa concatenata di mostri. Ma sembra ancora un modo terribile per costruire stringhe SQL. Ne ho uno con circa 50 parametri al lavoro, quindi 50 righe di mysqlstring = mysqlstring +...
. Non carino.
Per inciso, che esclude l'uso di continuazioni di riga per formattare la stringa, in quanto vi è un limit on the number of line-continuations you can use on a single string (suggerimento: meno di 50). Inoltre, VBA non ti consente di inserire un commento dopo la continuazione della riga, grr!
Fino a poco tempo fa, ho pensato che fosse l'unico modo per costruire queste stringhe. Ma recentemente ho visto un modello diverso, iniettando i parametri nella stringa come this question (VB.NET) su cui ho postato una risposta, e mi chiedevo se ci fosse un equivalente di Parameters.AddWithValue()
per VBA, o se fosse addirittura meglio dell'approccio di concatenazione della stringa . Quindi ho pensato che questo meritasse una sua domanda. Forse c'è qualcosa che mi manca qui.
Alcuni esperti di Access possono chiarire quali sono le migliori pratiche per la creazione di stringhe SQL in Access/VBA.
Se si utilizza CurrentDB, anziché assegnare CurrentDB a una variabile, non è possibile restituire i record interessati. – Fionnuala
Abbastanza vero, continuo a dimenticare quel dettaglio. Ho uno snippet di codice per gestire questa situazione. –
E non è possibile utilizzare SELECT @IDENTITY per ottenere il PK di composizione automatica dell'ultimo inserto. –