Newsgroup: it.comp.lang.delphi
Titolo: Problemi d'apostrofi durante una query

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

 Qualcuno saprebbe indicarmi una soluzione?
Comincia col dirci che database usi, e CHE eccezione genera, sarebbe 
utile...
-- 
Jax

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
Jax ha scritto:


 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
)

   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

 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 
ab...@newsland.it