Newsgroup: it.comp.lang.delphi
Titolo: Intercettare errori con ADO (db Access 2000)

Ciao,
 qualcuno che usa ADO sa come intercettare un errore di Chiave Duplicata in
modo
da visualizzare un proprio messaggio? (Diverso da quello generato da
access).
Grazie
WinXP
D6
Access2000

 Grazie
Andrea

Metti tutto in un "try...except" e risolvi :)
try
...
...
except on e: exception do begin
   /// trapping dell'errore   
   end;
end;
Il problema e' di stabilire se trappando l'errore sollevato dal jet engine si riesce
ad ottenere l'informazione che lui cerca, e cioe' il codice numerico dell'errore
di chiave duplicata.
Nel passato si era proprio parlato di questo, ma non mi ricordo quando, fattosta'
che nell'oggetto exception dovrebbe eseerci questo codice....
Ciao
Morde

 Morde
Andrea

senza passare per i componenti delphi.
Infatti la unit ComObj mette a disposizione EOleException, che contiene il codice numerico
dell''errore, ma non c'e' modo di tracciarlo...
Cmq piu' di questo non saprei, io intercetto l'errore e ne stampo la verbosita', e se questa
non dovesse piacere da vedersi, allora ne faccio un override del tipo:
try
    tabella.POST
except on e: exception do begin
   showmsg('errore durante il salvataggio dei dati');
   LogJetError(E.Message);
   end;
end;
Dove LogJetError sara' una procedura che logga tutti gli errori del motore jet.
Ciao
Morde

 Morde
Andrea

Ciao,
ho sollevato la questione degli errori pur non essendone del tutto
all'oscuro.
Volevo sentire un vostro parere.
Allora per tracciare il codice errore di ADO faccio cosi':
try
            ExecSQL;
except
   for i:=0 to dm.ADOConnection1.Errors.count-1 do
            begin
            ShowMessage(IntToStr(dm.ADOConnection1.Errors[i].Number));
            ShoWmessage(IntToStr(dm.ADOConnection1.Errors[i].NativeError));
            end;
       dm.ADOConnection1.Errors.clear ;
end;
Per la chiave duplicata ottengo i seguenti codici
Number : -
2147467259
NativeError : -105121349
Ora da quello che leggo qui
http://www.devguru.com/Technologies/ado/quickref/error_number.html
il primo codice e' un codice di errore generico, del secondo (NativeError)
non se ne fa menzione.
Potrebbe essere il codice che mi serve (KeyViolation)? Se cosi fosse potrei
associarci un mio messaggio
"Record gia' esistente" e non utilizzare piu' quella odiosa finestra di
errore generata da access....
Ciao

 Ciao
Ciao
Andrea

 errore generata da access....
allora per quello che concerne il "number" (il primo codice) dovrebbe essere relativo
al componente Delphi che utilizzi (almeno è così per il BDE e altri oggetti) ed effettivamente
non ti da informazioni relative al Database Server, il secondo "Native Error" è SEMPRE
il codice restituito  dal Database
quindi, per esempio, il codice relativo alla chiave duplicata avrà un valore se usi Oracle
ed uno diverso se usi Informix.
A cosa corrisponde il valore lo trovi nella documentazione del Database, di solito ci sono
dei tools (informix a FindErr)
Saluti
Giorgio

E.ErrorCode
L'avevo gia' utilizzato, ma ho abbandonato questa strada: come puoi vedere dalla continuazione
del thread risalire al codice numerico prodotto da access e' una strada non sgombra da insidie...
E' una strada che cmq io ho abbandonato, visto che impostando opportunamente le relazioni in Access
riesco ad ottenere un controllo pressoche totale sui dati che spedisco al db, senza incorrere in
 sgradevoli messaggi kilometrici e dai codici numerici improbabili...
Se il nostro amico vuole evitare di incorrere in chiavi duplicate senza troppo impazzire sui codici,
suggerisco una AdoQuery opprtuna, che richiamata con un semplice AdoQuery.Open rivela l'esistenza
della chiave che sta per essere inserita...
Ciao
Morde

 del thread risalire al codice numerico prodotto da access e' una strada
non sgombra da insidie...
[CUT
]>.. Se il nostro amico vuole evitare di incorrere in chiavi duplicate senza



Ti ringrazio.
Cosa vuoi dire che non e' raccomandato
usare la Error Collection?
Ps. Se possibile non postare un copia ed incolla dell'help di D,
      uno potrebbe anche non conoscere l'inglese no?
     Ciao!

      Ciao!
Ciao
Andrea

si rallentano le prestazioni?
Dipende dalla query.
Nel tuo caso no.
Fare un "select KEY_COLUMN from tabella where KEY_COLUMN = 'xxxxxxx'" sara' velocissimo perche'
stai interrogando la tebella su un campo chiave indicizzato.
Morde

Ciao Morde,
mi rendo conto che sto sconfinando nell'off-thread ma....
Ho provato ad eseguire il tuo SQL (con db access) ma mi ritorna un errore.
Non e' che KEY_COLUMN
e' roba di MySQL?
Potresti spiegarmi brevemente quale e' la differenza tra il tuo "SELECT
KEY_COLUMN..." ed un
normale "SELECT codice from tabella WHERE codice = 'xxxxxxxx' "?
Ciao
Fabio


normale "SELECT codice from tabella WHERE codice = 'xxxxxxxx' "?
Non mi sono spiegato bene, in realta' la mia sql era una specie di meta-sql,
cioe' per key column intendo la colonna chiave (quella che tu indichi come "codice")
Se tu nella tua tabella hai la colonna chiave che si chiama IDCodice, prova a eseguire
"SELECT IDCodice from Tabella WHERE IDCodice = 'xxxxx'", se il recordcount e' > 0 allora
hai trovato la chiave e quindi sei in chiave duplicata.
Ovviamente se la tua coloona chiave e' di tipo numerico aggiorna la sql di conseguenza.
Ciao
Morde

 Ovviamente se la tua coloona chiave e' di tipo numerico aggiorna la sql di
conseguenza.
Grazie. Infatti nell'attesa della tua risposta avevo fatto proprio cosi e
funziona....
Ciao e grazie!