J'ai vainement cherché comment récupérer le code SQL suite à exécution d'une requète.
J'utilise des TIBxxxxx (database,transaction et query), et je n'ai trouvé aucune propriété ou méthode pour accéder à SQLCode.
La lecture attentive de la doc IB (API guide) m'a fait remarqué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part isc_sqlcode
L'utilisation de cette fonction est faite dans l'unité IB.PAS (jusque là, tout va bien )
Singe voit, singe fait : je prends les quelques lignes qui m'intéressent dans cette proc pour me faire 1 fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 procedure IBDataBaseError; var sqlcode: Long; IBErrorCode: Long; local_buffer: array[0..IBHugeLocalBufferLength - 1] of char; usr_msg: string; status_vector: PISC_STATUS; IBDataBaseErrorMessages: TIBDataBaseErrorMessages; begin usr_msg := ''; { Get a local reference to the status vector. Get a local copy of the IBDataBaseErrorMessages options. Get the SQL error code } status_vector := StatusVector; IBErrorCode := StatusVectorArray[1]; IBDataBaseErrorMessages := GetIBDataBaseErrorMessages; sqlcode := isc_sqlcode(status_vector); ...............
que j'ai implantée dans un TcustomerData (MonUnit)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Function GetSQLCode:LongInt; var sqlcode: Long; // type défini comme LongInt dans IBheader IBErrorCode: Long; status_vector: PISC_STATUS; begin status_vector := StatusVector; IBErrorCode := StatusVectorArray[1]; sqlcode := isc_sqlcode(status_vector); result:=sqlcode; end;
Mais, ça ne compile pas:
motif: types incompatibles MonUnit.integer et IB.integer
sur la ligneet je ne vois pas pourquoi !status_vector := StatusVector;
En désespoir de cause, j'ai mis ce même code dans IB.pas (là, c'est OK), mais je ne suis bien sûr pas satisfait de cette solution...
Qui peut m'éclairer sur mon erreur ?
Les sources IB* sont consultables ICI
Partager