Discussione:
Problemi d'apostrofi durante una query
(troppo vecchio per rispondere)
Tiziano Crimella
2006-07-24 07:24:41 UTC
Permalink
Ho il seguente problema:
una semplicissima query: query1.sql.add('select * from Cognome');

Il problema é che quando seleziono un cognome contenente un apostrofo,
tipo il cognome "D'Amato", chiaramente la query si va a fare benedire
perchè genera un'eccezione.
Qualcuno saprebbe indicarmi una soluzione?

PS In questo momento sto cercando di vedere se tramite la funzione
StringReplace riesco a trovare qualche rimedio

ciao e grazie
Tiziano Crimella
Jax
2006-07-24 07:35:16 UTC
Permalink
Post by Tiziano Crimella
una semplicissima query: query1.sql.add('select * from Cognome');
Il problema é che quando seleziono un cognome contenente un apostrofo,
tipo il cognome "D'Amato", chiaramente la query si va a fare benedire
perchè genera un'eccezione.
Qualcuno saprebbe indicarmi una soluzione?
Comincia col dirci che database usi, e CHE eccezione genera, sarebbe
utile...
--
Jax
Tiziano Crimella
2006-07-24 08:21:14 UTC
Permalink
Hai ragione...sorry.
Il db é mySql e l'eccezione era eMySQLEngineError.
Comunque l'ho risolto tramite StringReplace in questa maniera:

procedure TCercaImpiegati.dbGridImpiegatiCellClick(Column: TColumn);
begin
with qryImpiegati do begin
Close;
SQL.Clear;
SQL.Add('
select * from dipendenti
where Cognome = '''+StringReplace(Cognome,chr(39),'''''',[])'''');
ExecSQL;
Open;
end;
end;

Praticamente faccio una ricerca di D''Amato e mySql lo accetta ugualmente.
ciao
Post by Jax
Comincia col dirci che database usi, e CHE eccezione genera, sarebbe
utile...
Marco Breveglieri
2006-07-24 08:42:15 UTC
Permalink
Post by Tiziano Crimella
Il db é mySql e l'eccezione era eMySQLEngineError.
Comunque l'ho risolto tramite StringReplace in questa maniera [...]
Per abitudine, non inserisco mai i valori parametrici "inline"
direttamente nello statement della query da eseguire.

In genere, credo sia più opportuno fare uso di parametri (/Params/)
definendo appositi "segnaposto" all'interno della query che vado poi a
valorizzare successivamente.

In questo modo, è possibile eseguire un controllo di appartenenza ad un
determinato tipo sui dati che devono essere sostituiti ai parametri, si
scongiurano eventuali problemi di interpretazione legati alle
impostazioni internazionali del sistema (ad esempio, la conversione di
una stringa con una data per un campo data/ora verace), è possibile
inoltre velocizzare l'esecuzione della query in determinati casi,
laddove lo consente il "motore" utilizzato per l'accesso al database;
per ultimo, ma non in ordine di importanza, ci si protegge maggiormente
dal pericolo di "SQL Injection".

Ciao,
Marco.
--
MARCO BREVEGLIERI
(http://www.marco.breveglieri.name)
Jax
2006-07-24 09:02:23 UTC
Permalink
Post by Tiziano Crimella
select * from dipendenti
where Cognome = '''+StringReplace(Cognome,chr(39),'''''',[])'''');
ExecSQL;
Ti conviene *assolutamente* usare i parametri, come ti è stato detto da
Marco.
Se proprio devi fare così, piuttosto fai
'where Cognome = ' + QuotedStr(Cognome)
che fa un po' meno brutto ;)

Inoltre, non ti serve fare ExecSQL: per una query di tipo SELECT, ti
basta fare l'Open.
L'ExecSQL, come scritto nella guida, serve solo per quelle query che
fanno operazioni di scrittura che non ritornano un recordset, tipo
UPDATE o DELETE, e che quindi non serve che siano aperte, basta eseguirle.
--
Jax
Andrea Laforgia
2006-07-24 10:29:27 UTC
Permalink
Post by Tiziano Crimella
Il problema é che quando seleziono un cognome contenente un apostrofo,
tipo il cognome "D'Amato", chiaramente la query si va a fare benedire
perchè genera un'eccezione.
Devi usare i parametri. Problemi del genere esistono anche per le date.

SQLStatement := 'select * from tiziecaii where cognome = :cognome';

Poi valorizzi il parametro 'cognome' in base al componente di accesso ai
dati che stai utilizzando:

http://www.google.com/search?client=firefox-a&rls=org.mozilla%3Ait-IT%3Aofficial_s&hl=en&q=delphi+query+parameter&btnG=Google+Search
http://groups.google.com/groups?client=firefox-a&rls=org.mozilla:it-IT:official_s&hl=en&q=delphi%20query%20parameter&btnG=Google+Search&ie=UTF-8&oe=UTF-8&sa=N&tab=wg
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Loading...