Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    892

    [.NET] Problema con apici

    Salve a tutti.

    Ho costruito un'applicazione con .NET che scrive dei dati su db Access. Fin qui tutto bene. Ho però il seguente problema:

    se qualcuno scrive un testo con degli apici (un semplice apostrofo, per esempio) che va in un campo Memo del db, mi genera un errore e non scrive il dato...

    Per esempio: "dellanno" me lo scrive correttamente, mentre "dell'anno" no, perché è presente l'apostrofo.

    Devo assolutamente rimediare all'errore, qualcuno sa dirmi come?

    Posto qui il codice:

    codice:
    Dim sql As String = "INSERT INTO tabella (idutente,nome,indirizzo,nomeutente, nascita, personaleint) VALUES ('" & stridutente & "','" & strnome & "','" & strindirizzo & "','" & strnomeutente & "','" & strdatanascita & "','" & strpersonaleint & "')"

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Questo è uno dei casi in cui vale la pena utilizzare i parametri, nonostante io sia convinto che andrebbero utilizzati sempre e comunque.

    Sostituisci dei segnaposto ? nello statement ove devi specificare i valori e crea degli oggetti OleDbParameter per ciascun segnaposto; ciascun parametro (istanza di OleDbParameter) andrà valorizzato (proprietà Value) con il dato da inserire e aggiunto alla proprietà Parameters del comando OleDbCommand di riferimento.

    A mio avviso, è la soluzione più pulita in tutti i casi in cui è necessario eseguire uno statement SQL parametrico.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,580
    e con il debug come fai?
    in genere se ci sono erriri nella stringa sql io la copio e la incollo in access,e solo lui mi dice xche genera erroori

    ccon i parametri come fai a testarla?
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da Kahm
    ccon i parametri come fai a testarla?
    Se la query contiene errori, è l'applicazione a restituire un'eccezione appropriata consentendomi di risalire al problema. Non c'è bisogno di testarla in Access.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Le stringe SQL contenenti il carattere ' vengono eseguite senza
    problemi se si raddoppia l'apice ''. Database come ORACLE,DB2 e
    SQLServer supportano questo comportamento.

    Non so se Access fa lo stesso.

    In tutti i casi la soluzione più veloce è quella di sostituire gli
    apici aventi funzione di delimitatore stringa con i doppi apici, ".

    Una piccolissima funzione ti risolve il problema.
    codice:
    SQL = "INSERT INTO tabella (idutente,nome,indirizzo,nomeutente, nascita, personaleint) VALUES (" & Apici(stridutente) & "," & Apici(strnome) & "," & Apici(strindirizzo) & "," & Apici(strnomeutente) & "," & Apici(strdatanascita) & "," & Apici(strpersonaleint) & ")"
    
    Public Function Apici(s As String) As String
       Apici = Chr$(34) & s & Chr$(34)
    End Function
    Studia bene la composizione della stringa SQL, in quanto gli apici
    singoli di delimitazione non devono più essere inclusi.

    Ciao,
    Ciao, Brainjar

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da Brainjar
    Le stringe SQL contenenti il carattere ' vengono eseguite senza problemi se si raddoppia l'apice ''.
    A meno che l'utente non raddoppia l'apice nel testo che inserisce. Secondo me, si tratta sempre di soluzioni abbozzate e molto pratiche che lasciano l'applicazione facilmente in balia addirittura di attacchi e raggiri come sql injection e affini.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Si, ma se invece di fare sempre il filosofo, posti un po' di codice,
    vedi che tutti diventiamo dei super esperti.

    Intanto la soluzione che ho postato funge.

    Non paga molto la politica del 'non mangio così non mi devo lavare i
    denti'.

    Ciao,
    Ciao, Brainjar

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da Brainjar
    Si, ma se invece di fare sempre il filosofo, posti un po' di codice, vedi che tutti diventiamo dei super esperti.
    Purtroppo non utilizzo VB.NET, ma Delphi.NET, perciò non ho il tempo e la voglia di tradurre codice in VB.NET, e non sono tenuto a farlo, ma questo non significa che i suggerimenti che ho dato siano sbagliati o ingiustificati (dato che ho scritto tutte le motivazioni); inoltre, ho citato tutte le classi specifiche che si possono ricercare autonomamente nella documentazione Microsoft .NET SDK, dove ci sono già tonnellate di esempi nei linguaggi C# e VB.NET.

    Originariamente inviato da Brainjar
    Intanto la soluzione che ho postato funge.
    Funge fino a quando non si finisce nel caso in cui non funziona, con il problema che qualche utente malizioso potrebbe pure approfittarne.

    Inoltre, se la query va ripetuta spesso, non può essere "preparata" ed eseguita più volte modificandone i valori parametrici perchè...non esistono parametri, ma solo uno statement SQL che cambia radicalmente di volta in volta.

    L'uso dei parametri *obbliga* la conversione dei valori specificati dall'utente nei tipi di dati che ci si aspetta di ricevere nella query, perciò rappresenta senz'altro una soluzione più sicura.

    Originariamente inviato da Brainjar
    Non paga molto la politica del 'non mangio così non mi devo lavare i denti'.
    In realtà, mangio e mi lavo i denti senz'altro meglio, ma non sono obbligato a farlo per spiegarlo a qualcuno... :rollo:

    A parte questa metafora sconclusionata, se l'autore originale della discussione ritiene che sia più saggio adottare la tua soluzione perchè non ha voglia di approfondire e trovare autonomamente un esempio di codice pur avendo tutti i riferimenti necessari, che faccia pure.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Originariamente inviato da Brainjar
    Intanto la soluzione che ho postato funge.
    Come gia detto da alka, quando si tratta di costrutire query sql e' molto meglio imparare ad usare i parametri piuttosto che incollare pezzi di stringa.
    A parte le tonnellate di esempi presenti sui forum (questo compreso) e su msdn se ci fosse bisogno di un altro esempio
    codice:
    tuocommand.CommandText = "INSERT INTO tabella (campo) VALUES (?)"
    tuocommand.Parameters.Add("@campo", OleDb.OleDbType.VarChar).Value = "ciao ciao"
    Saluti a tutti
    Riccardo

  10. #10
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Anche io non uso VB.Net e neanche, attualmente, VB.60. Le 'prepared
    statements' sono il mio pane quotidiano. Così come le stored
    procedures.
    Anche io di fronte a richieste come quella di Franz79, sono tentato
    di suggerire di cambiare la modalità operativa, piuttosto che dare
    un aiuto immediato.
    Se però rifletti un attimo, ti rendi sicuramente conto che, molto
    probabilmente, non è solo quella determinata procedura che andrebbe
    riscritta, ma tutta l'applicazione.
    Per applicare i tuoi suggerimenti tipo :
    Sostituisci dei segnaposto ? nello statement ove devi specificare i valori e crea degli oggetti OleDbParameter per ciascun segnaposto; ciascun parametro (istanza di OleDbParameter) andrà valorizzato (proprietà Value) con il dato da inserire e aggiunto alla proprietà Parameters del comando OleDbCommand di riferimento.
    presupponi che il richiedente sappia perfettamente cosa siano le
    query parametriche e ne abbia acquisito la modalità operativa.

    A questo punto e con queste premesse l'utente si dice "E' vero,
    adesso faccio come mi suggerisce Alka. E già che ci sono tutte le
    query che eseguo le rendo parametriche".

    Nella realtà, come capita spesso di capire dai post, i quesiti sono
    di persone che si avvicinano alla programmazione e mancano delle
    'basi' di algoritmi e disegno di Basi di Dati.

    Nella mia discreta esperienza, insegno programmazione dal 1985,
    sviluppo applicazioni in VB, COM, COM+ e da tre anni J2EE, mi sono
    trovato nella situazione di avere un problema urgente e, quasi
    invariabilmente, la strategia di risoluzione è stata :

    1) Capire il problema
    2) Trovare una soluzione immediata
    3) Rivedere l'approccio al problema cercando soluzioni performanti
    4) Includere tali soluzioni non nella prossima patch ma nella
    prossima release.

    Per quanto riguarda la metafora, puo sembrare sconclusionata.
    E' una questione di punti di vista. Senza metafora, e sono i
    concetti che hai espresso, suona così :

    "Io, che sono più bravo ti te, non mi sarei trovato nel problema.
    Avrei utilizzato questo, collegato quello ed impostato quell'altro.
    Lo so che a te serve una situazione immediata ma non sono tenuto a
    dartela. Ho postato solo per indicare come avrei risolto io."

    Spesso quello che serve è una spintarella pratica. E, soprattutto,
    parlare la stessa lingua (concedimi questa metafora, non ho
    resistito).

    Ciao,
    Ciao, Brainjar

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.