Tables

1.3 Comporre stringhe SQL (tenendo conto degli apici).
  NicoS
(D)
Come posso risolvere il problema degli apici quando creo una stringa SQL con filtro su campo testo?

(R)
Capita molto spesso di eseguire query o utilizzare il controllo Data per aprire un recordset di una tabella utilizzando stringhe SQL, molte volte per esigenza sono parametriche, come ad esempio:

"SELECT ALL * FROM Canzoni " & "WHERE Titolo = '" & tbTitolo.Text & "';"

E' un piccolo filtro che seleziona le canzoni che hanno un certo titolo, che ricaviamo dal contenuto di una textbox di nome tbTitolo.

SEMBRA CHE FUNZIONI SEMPRE, ma purtroppo non è vero: se applichiamo il filtro per trovare la canzone , ci sarà un bel arresto del programma (err. N° 3075), perché la SQL è diventata:

"SELECT ALL * FROM Canzoni WHERE Titolo = 'Silvia's theme';"

dove ovviamente c'è un errore perché il titolo di ricerca è diventato , perché l'apice interrompe la stringa. Per far sì che funzioni tutto, l'SQL deve essere:

...WHERE Titolo = 'Silvia''s theme';"

Quindi gli apici nelle stringhe devono essere raddoppiati (è lo stesso problema che si ha in VB con le virgolette ").

La funzione proposta risolve questo problema e nell'esempio verrà utilizzata così:

"SELECT ALL * FROM Canzoni " & _
"WHERE Titolo = '" & _
ComponiStringaPerSQL(tbTitolo.Text) & "';"

La funzione ComponiStringaPerSQL prende la stringa passata per parametro e ritorna la stringa con gli apici raddoppiati.

Public Function ComponiStringaPerSQL (ByVal stringa As String) As String
   Dim n As Long, posiz As Long
   Dim h As String
   On Local Error Resume Next
        
   If IsNull(stringa) Then
      h = ""
      GoTo Fine
   End If
   h = stringa: posiz = 1
   n = InStr(posiz, h, "'")
   While n > 0
      h = Left$(h, n) & "'" & Right$(h, Len(h) - n)
      posiz = n + 2
      n = InStr(posiz, h, "'")
   Wend
Fine:
   ComponiStringaPerSQL = h
End Function


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.