Newsgroup: it.comp.lang.delphi
Titolo: Caratteri particola & ADO

Ciao a tutti,
ho un problema molto strano.
Costruisco dinamicamente una stringa SQL per fare un UPDATE, l'assegno
alla proprietà SQL di un oggetto ADOQUERY, e la eseguo.
Logicamente per i campi stringa mi preoccupo di raddoppiare l'apice ( '
) ove presente, ma ho notato che se l'utente inserisce un apice storto
( non sò come si chiama, in realtà è questo = `, char(96)) , viene
creato un PARAMETRO al momento che assegno la stringa SQL alla
proprietà su menzionata.
Logicamente all'esecuzione l'errore restituito è il presente :
---------------------------
Debugger Exception Notification
---------------------------
Project GIV2005.exe raised exception class EOleException with message
'L'oggetto Parameter non è stato definito correttamente. Le
informazioni fornite sono incoerenti o incomplete'.
---------------------------
Break   Continue   Help
---------------------------
Qualcuno ha mai avuto questo problema?
Mi sapreste dare qualche consiglio in merito?
Ciao
Rino

 proprietà su menzionata.
siccome crei dinamicamente la query, prova sostituire l'apice storto con 
CHR(96)
Ho fatto una prova veloce in Access e questa query non mi dà errori:
  SELECT CHR(96) + "TESTO"
-- 
Mauro Falzari 
 
  La persona che conosce il vostro segreto
  diventerà il padrone della vostra libertà.
    (François La Rochefoucauld, 1613-1680)

 CHR(96)
ho fatto così :
 myString := StringReplace(myString, '`', chr(96), [rfReplaceAll])
ma non funziona cmq...
Non mi era mai capitata una cosa del genere.
Con la dbExpress e DB2 come DB, non mi ha mai dato questo errore...
Che strano.
Cmq... il problema non è risolto, avete qualche altro consiglio?
Rino

Ancora più strano.
Se la stringa SQL è così :
Update SDA.MENU Set
   M1FOR = 'A` MASS01F',
   M1COM = NULL,
   M1MEN = '23213',
   M1DES = 'Prova1',
   M1PRZ = NULL,
   M1DTM = '20061017',
   M1UTE = 'LELLO'
Where
   M1PRO = 19390 And
   M1DTM = '20061017'
funziona, anche se alla seconda riga ovvero M1FOR = 'A` MASS01F',  c'è
il carattere chr(96).
Inveve se scrivo :
Update SDA.MENU Set
   M1FOR = 'A` MASS01F',
   M1COM = NULL,
   M1MEN = '23213',
   M1DES = 'Prova : 1',
   M1PRZ = NULL,
   M1DTM = '20061017',
   M1UTE = 'LELLO'
Where
   M1PRO = 19390 And
   M1DTM = '20061017'
non funziona. Quello che cambia è solo la quinta riga ovvero M1DES =
'Prova : 1', infatti
da debug controllavo quando venisse creato il parametro fasullo
(myQuery.Parameters.Count).
Mi sono accorto che appena assegno la quinta riga viene creato il
parametro.
Quindi il problema sembra che siano i due punti, ma non è così,
perchè se non c'è il carattere chr(96), tutto funziona, d'altronde,
se c'è il carattere ma non ci sono i 2 punti, funziona tutto
egualmente, ma quando la stringa SQL contiene entrambi, viene creato
questo parametro fasullo, il quale nome è la stringa compresa dai 2
punti fino alla fine della stringa SQL.
Ovvero :
myQuery.Parameters[i].name =  '1, M1PRZ = NULL, M1DTM = '20061017',
M1UTE = 'LELLO' Where M1PRO = 19390 And M1DTM = '20061017'
Tutto troppo strano...
Vi prego, aiutatemi.
Rino

 Vi prego, aiutatemi.
Intanto diciamo che il carattere : (duepunti) e' usato per indicare la
presenza di un parametro, in congiuzione con l'apice che confonde
l'iterprete SQL
soluzione 1 :
 elimina il duepunti ;)
soluzione 2:
 Gestisci tutta la update con parametri. Uno per ogni campo.
In generale scrivere le stringhe sql direttamente come hai fatto tu
crea un problema di dipendenza dal dialetto SQL che usi al momento.
Si passa attraverso componenti proprio per potersi astrarre dal DB
usato.
ciao
S

 S
ciao & grazie
Rino

 
Ciao,
hai provato a mettere ParamCheck a False nella ADOQuery?
Ciao, Vittorio

 ma non funziona cmq...
non ho approfondito ciò che hai scritto nel post successivo, ma io 
intendevo una sostituzione + una concatenazione. Per esempio se la stringa 
fosse:
  myString := "`Enciclopedia Generale"
come risultato si dovrebbe avere:
   myString := 'CHR(96) + "Enciclopedia Generale"'
In questo modo, Access funzia. 
