Borland und Raiserrors
-
Hallo,
Ich benutze den Borland C++ Builder 6.0 und eine Sybase Datenbank. Alle Abfragen laufen über Stored Procedures. Werden Prouzeduren falsch oder unauthorisiert aufgerufen wird ein Raiserror generiert.
z.B.: (Stored Procedure Code)
if @OPTION=4 begin raiserror 66666 "dies ist der Testfehler 66666" return end
Setzte ich jetzt über ein TSQLCLientDataSet den Query "PR_TESTPROC @OPTION=4" erhalte ich folgende Fehlermeldung über das Exceptionhandling:
"DataSet1: Cursor nicht aus Abfrage zurückgekehrt"
Natürlich ist das nicht die Nachricht auf die ich scharf bin. Ich möchte den Text des Raiserrors erhalten (also "dies ist der Testfehler 66666"). Nur weiß ich leider nicht wie ich mit dem Builder an den Raiserror herankommen kann.
Weiß jemand von euch wie das geht?
Danke!!!
-
niemand??
Gibt Ihr euch denn immer nmit den Borland Exceptions zufrieden? Es muß doch jemanden geben der schonmal die originalen DB Fehlermeldungen in seinem Programm feststellen wollte!
Ich habe schon alles durchsucht aber leide rnichts gefunden. Weder hier noch sonstwo im Netz...
-
-
Da dreht sich leider alles um Delphi und ADO.
Ich benutze DBExpress und C++. Aber danke!
Ichhabe mir in den Hilfen noch folgendes zusammengesucht. Leider checke ich es nicht das alles zusammenzubauen....
SQL-Befehle mit einem Callback überwachen
Statt TSQLMonitor einzusetzen, können Sie die Vorgehensweise, in der Ihre Anwendung SQL-Befehle
verfolgt, auch anpassen, indem Sie die Methode SetTraceCallbackEvent der
SQL-Verbindungskomponente verwenden. SetTraceCallbackEvent nimmt zwei Parameter entgegen:
einen Callback des Typs TSQLCallbackEvent sowie einen benutzerdefinierten Wert, der der
Callback-Funktion übergeben wird.
Die Callback-Funktion nimmt zwei Parameter entgegen: CallType und CBInfo:
CallType ist für zukünftige Verwendungszwecke reserviert.
CBInfo ist ein Zeiger auf eine Struktur, die die Kategorie (dieselbe wie CallType), den Text des
SQL-Befehls sowie den benutzerdefinierten Wert, der der Methode SetTraceCallbackEvent
übergeben wird, enthält.
Der Callback gibt einen Wert vom Typ CBRType zurück, normalerweise cbrUSEDEF.
Der dbExpress-Treiber ruft Ihren Callback immer dann auf, wenn die SQL-Verbindungskomponente dem
Server einen Befehl übergibt, oder wenn der Server eine Fehlermeldung zurückgibt.TSQLConnection::SetTraceCallbackEvent
TSQLConnection Siehe auch
Die Methode SetTraceCallbackEvent ordnet der SQL-Verbindung eine Callback-Funktion zu, die bei
jeder an den Server übergebenen SQL-Anweisung ausgeführt wird.void __fastcall SetTraceCallbackEvent(TSQLCallbackEvent Event, int IClientInfo);
Beschreibung
Mit SetTraceCallbackEvent legen Sie eine Callback-Funktion fest, die immer dann aufgerufen wird,
wenn zwischen dem dbExpress-Treiber und dem Datenbankserver eine SQL-Anweisung übertragen
wird. Die angegebene Funktion wird der Eigenschaft TraceCallbackEvent zugewiesen.
Event ist die betreffende Funktion.
Der benutzerdefinierte Wert IClientInfo wird als Teil der SQLTraceDesc-Struktur übergeben, die dem
Parameter CBInfo der Callback-Funktion zugewiesen wird.
Tip: Um einen möglichen Konflikt mit einer bereits vorhandenen Callback-Funktion zu
vermeiden, sollten Sie die Eigenschaft TraceCallbackEvent prüfen, bevor Sie
SetTraceCallbackEvent aufrufen.TSQLCallbackEvent (Typ)
Der Typ TSQLCallbackEvent ist der Typ für Callback-Funktionen, die SQL-Meldungen zwischen
einer TSQLConnection-Komponente und einem Datenbankserver überwachen.Unit DBXpress typedef unsigned TRACECat; typedef CBRType __stdcall (*TSQLCallbackEvent)(TRACECat CallType, void *CBInfo);
Beschreibung
TSQLCallbackEvent ist der Typ der Eigenschaft TraceCallbackEvent von TSQLConnection-Objekten.
TSQLCallbackEvent verwendet die folgenden Parameter:
Parameter Beschreibung
CallType Gibt den Typ der Callback-Funktion an. Zulässig ist nur der Wert cbTRACE,
der festlegt, daß die Callback-Funktion für jede Meldung ausgeführt wird, die
zwischen Treiber und Datenbankserver übergeben wird.
CBInfo Ein Zeiger auf einen SQLTRACEDesc-Struktur. SQLTRACEDesc enthält den
Text der gerade übergebenen Meldung, die Kategorie der Meldung und einen
benutzerdefinierten Wert, der an die Methode SetTraceCallbackEvent
übergeben wurde.
TSQLCallbackEvent gibt einen Wert zurück, der angibt, wie die Überwachung fortgesetzt werden
soll. Normalerweise handelt es sich um den Wert cbrUSEDEF. Andere mögliche Rückgabewerte
sind cbrCONTINUE, cbrABORT, cbrCHKINPUT, cbrYES, cbrNO, cbrPARTIALASSIST, cbrSKIP und
cbrRETRY.SQLTRACEDesc, pSQLTraceDesc (Typen)
Der Typ SQLTraceDesc codiert Informationen über eine Meldung, die zwischen einen DBExpress
-Treiber und einem Datenbankserver ausgetauscht werden.Unit SqlExpr struct SQLTRACEDesc { char pszTrace[1024]; TRACECat eTraceCat; int ClientData; WORD uTotalMsgLen; } typedef SQLTRACEDesc *pSQLTRACEDesc;
Beschreibung
SQLTRACEDesc beschreibt eine Meldung, die gerade zwischen einem DBExpress-Treiber und
einem Datenbankserver ausgetauscht wurde. pSQLTRACEDesc ist ein Zeiger auf eine
SQLTRACEDesc-Struktur.
pszTrace ist der Befehl, der gerade übergeben wurde.
eTraceCat gibt die Kategorie des gerade übergebenen Befehls an. Es handelt sich um einen
Aufzählungswert, der einem TSQLTraceFlag-Wert entspricht.
ClientData ist ein anwendungsspezifischer Wert, der von der Methode SetTraceCallbackEvent
bereitgestellt wird. Erfolgt der Zugriff auf SQLTraceDesc mit einer für TSQLConnection
bereitgestellten Callback-Funktion, kann dieser Wert eine beliebige anwendungsdefinierte Bedeutung
haben. Wird der SQLTraceDesc-Wert von einem TSQLMonitor-Ereignis bereitgestellt, sollte
ClientData nicht verwendet werden.
uTotalMsgLen gibt die Länge des Strings in pszTrace an.Das alles zu einem funktionierenden ganzen zusammenzubasteln ist mir bisher leide rnicht gelungen....
Hat jemand eine Idee wie das gehen könnte?
Danke!
-
anscheinend muss ich TSQLMonitor benutzen.
http://www.visoco.com/forum/viewtopic.php?t=3Aber so ne Speicherfresserklasse für so n ollen raiserror oder ne printanweisung....
-
Clip schrieb:
Da dreht sich leider alles um Delphi und ADO.
Ich benutze DBExpress und C++.
Und hast du dir mal die Erläuterungen zu TSQLClientDataSet::CommandText angesehen?
-
Ja, aber der CommandText bestimmt doch nur den Query der abgesetzt wird.
Das Beispiel auf das Du verweist zeigt doch nur wie man einen Raiserror absetzt. Aber nicht wie er im Builder empfangen werden kann. Oder checke ich es nicht???