SELECT ed Apostrofo

di il
14 risposte

SELECT ed Apostrofo

Ho un problema con la stringa di ricerca SQL all'interno di un database ACCESS.

Di solito uso questa routine:

Sub RIcercaNOMINATIVO()
  On Error Resume Next
    Dim conn As Object
    Dim rs As Object
      Set conn = CreateObject("ADODB.Connection")
            conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\NomiClienti.mdb;User Id=Admin; Password="
         Set rs = CreateObject("ADODB.Recordset")
               With rs
                  .Open "SELECT * From NomiClienti Where Nome='Mario ROSSI'", conn, 3, 3
               End With
            Messaggio =Msgbox(rs("").Value)
   rs.Close
 Set rs = nothing
    conn.Close
 Set conn = Nothing 

Il problema comincia quando il cognome ha un apostrofo (faccio un Esempio: Mario D'Amico).

A questo punto la routine non funziona più e non restituisce alcun dato.

Come posso fare?

14 Risposte

  • Re: SELECT ed Apostrofo

    Ma che senso ha una sql con 

    Where Nome='Mario ROSSI'"

    Associalo ad una inputbox

    Io poi userei like. Metti che cerchi casa e per errore è memorizzato cassa.

    Ma se vuoi farti male allora “mario rossi” & ‘’'

  • Re: SELECT ed Apostrofo

    Raddoppialo

    ='D''Angelo'

  • Re: SELECT ed Apostrofo

    06/12/2023 - oregon ha scritto:


    Raddoppialo

    ='D''Angelo'

    Ah già.

    Continua a non avere senso il nome nel codice.

  • Re: SELECT ed Apostrofo

    06/12/2023 - sihsandrea ha scritto:


    06/12/2023 - oregon ha scritto:


    Raddoppialo

    ='D''Angelo'

    Ah già.

    Continua a non avere senso il nome nel codice.

    Grazie per la tua pronta risposta.

    Hai ragione quando dici che non ha senso una ricerca come quello che ho scritto, ma l'ho fatto solo per far capire il problema.

    Ho provato il tuo suggerimento ed in effetti funziona; ma se ho impostato invece un elenco di nomi predefinito (tra cui alcuni che appunto iniziano con la lettera D e l'apostrofo) che devo scegliere da una combobox, come faccio?

  • Re: SELECT ed Apostrofo

    07/12/2023 - coccobello ha scritto:


    06/12/2023 - sihsandrea ha scritto:


    06/12/2023 - oregon ha scritto:


    Raddoppialo

    ='D''Angelo'

    Ah già.

    Continua a non avere senso il nome nel codice.

    Grazie per la tua pronta risposta.

    Hai ragione quando dici che non ha senso una ricerca come quello che ho scritto, ma l'ho fatto solo per far capire il problema.

    Ho provato il tuo suggerimento ed in effetti funziona; ma se ho impostato invece un elenco di nomi predefinito (tra cui alcuni che appunto iniziano con la lettera D e l'apostrofo) che devo scegliere da una combobox, come faccio?

    In effetti potrei usare questa routine

    Set conn = CreateObject("ADODB.Connection")
                 conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Nomi.mdb;User Id=Admin; Password="
             Set rs = CreateObject("ADODB.Recordset")
                     With rs
                       .Open "SELECT * From Nomi WHERE Nome like '%" & ComboBox1.Text & "%'", conn, 3, 3
                     End With

    ma siamo sempre al punto di partenza.

  • Re: SELECT ed Apostrofo

    Stai facendo confusione.

    Non puoi scrivere una sql statica con where campo='pippo' perché la ricerca la fa solo se il campo ha valore “pippo”

    Se scrivi where campo=[miopatametro]

    Stai dicendo che il valore è quello nel contenitore di nome parametro che sarà un contenitore di tipo stringa.

    Un un controllo edit solo testo scrivi quello che vuoi (anche 7 apici)

    Poi passi a [mioparametro] il contenuto di quella stringa contenuta sulla casella di edit.

    Esempio:

    Se nella casella di edit scrivi: all'alba

    Passi al paramerto: all'alba

    La sql diventa: where campo='all''alba'

    Ma tu non devi preoccuparti di scrivere due volte l'apice.

    Così, se dopo aver filtrato per all'alba vuoi rifare un filtro per pippo basta rilanciare la sql e diventa: where campo='pippo' ma tu passi solo la stringa pippo senza apici. Se nella casella scrivi ‘pippo’ la sql diventa where campo=''pippo'' cioè si riporta anche gli apici.

    Sono stato chiaro?

    L'inutilità della sql scritta in quel modo è riferita al fatto che non passi un parametro ma scrivi direttamente una stringa nel codice.

  • Re: SELECT ed Apostrofo

    06/12/2023 - coccobello ha scritto:


    Il problema comincia quando il cognome ha un apostrofo (faccio un Esempio: Mario D'Amico).

    A questo punto la routine non funziona più e non restituisce alcun dato.

    Ciao,

    in questi casi e non solo, puoi usare il cmdParameters.Append per evitare di avere problemi con i caratteri speciali quando devi confrontare delle stringhe nella query Sql:
    Esempio Command object parameters | Microsoft Learn

    Questo metodo evita di avere problemi di questo genere, è semplice e affidabile.

  • Re: SELECT ed Apostrofo

    07/12/2023 - sihsandrea ha scritto:


    Stai facendo confusione.

    Non puoi scrivere una sql statica con where campo='pippo' perché la ricerca la fa solo se il campo ha valore “pippo”

    Se scrivi where campo=[miopatametro]

    Stai dicendo che il valore è quello nel contenitore di nome parametro che sarà un contenitore di tipo stringa.

    Un un controllo edit solo testo scrivi quello che vuoi (anche 7 apici)

    Poi passi a [mioparametro] il contenuto di quella stringa contenuta sulla casella di edit.

    Esempio:

    Se nella casella di edit scrivi: all'alba

    Passi al paramerto: all'alba

    La sql diventa: where campo='all''alba'

    Ma tu non devi preoccuparti di scrivere due volte l'apice.

    Così, se dopo aver filtrato per all'alba vuoi rifare un filtro per pippo basta rilanciare la sql e diventa: where campo='pippo' ma tu passi solo la stringa pippo senza apici. Se nella casella scrivi ‘pippo’ la sql diventa where campo=''pippo'' cioè si riporta anche gli apici.

    Sono stato chiaro?

    L'inutilità della sql scritta in quel modo è riferita al fatto che non passi un parametro ma scrivi direttamente una stringa nel codice.

     Scusami, io uso questa routine per cercare il dato, usando un campo textbox per la ricerca

       Dim conn As Object
       Dim rs As Object
       Dim COGNOMEInserisci As String
         b = 0
         c = 1
           COGNOMEInserisci = TextBox1.Text
             Set conn = CreateObject("ADODB.Connection")
                 conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Nomi.mdb;User Id=Admin; Password="
             Set rs = CreateObject("ADODB.Recordset")
                           With rs
                                 .Open "SELECT * From Nomi WHERE Nome like '%" & TextBox1.Text & "%'", conn, 3, 3
                           End With
                Messaggio=msgbox(rs("Dato").value)

    Se nella textbox inserisci il nome ROSSI funziona cioè mi restituisce il dato ricercato.

    Se invece inserisco D'AMICO invece non funziona, cioè non restituisce nessun dato.

    Dove sbaglio?

  • Re: SELECT ed Apostrofo

    07/12/2023 - coccobello ha scritto:


    Ho provato il tuo suggerimento

    Veramente era il mio suggerimento …

    07/12/2023 - coccobello ha scritto:


    .Open "SELECT * From Nomi WHERE Nome like '%" & TextBox1.Text & "%'", conn, 3, 3

    Diventa

    .Open "SELECT * From Nomi WHERE Nome like '%" & Replace(TextBox1.Text, "'", "'') & "%'", conn, 3, 3

    ma la via corretta è usare i parametri

  • Re: SELECT ed Apostrofo

    07/12/2023 - oregon ha scritto:


    .Open "SELECT * From Nomi WHERE Nome like '%" & Replace(TextBox1.Text, "'", "'') & "%'", conn, 3, 3

    perfetto.

    Grazie.

    Così funziona.

  • Re: SELECT ed Apostrofo

    Fai attenzione non usare la proprietà TEXT, Oregon è abituato a VB6, ma con Access non va bene in quanto la proprietà  non è esposta su controllo senza il focus, cambia così:

    TextBox1.Value

    Saluti

  • Re: SELECT ed Apostrofo

    Tutto corretto @Alex …

  • Re: SELECT ed Apostrofo

    07/12/2023 - oregon ha scritto:


    Tutto corretto @Alex …

    Sono le trappole inspiegabili di Access… ;-)

    Ciao Antonio

  • Re: SELECT ed Apostrofo

    07/12/2023 - @Alex ha scritto:


    Fai attenzione non usare la proprietà TEXT, Oregon è abituato a VB6, ma con Access non va bene in quanto la proprietà  non è esposta su controllo senza il focus, cambia così:

    TextBox1.Value

    Saluti

    ottimo suggerimento.

    Grazie.

Devi accedere o registrarti per scrivere nel forum
14 risposte