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=3

    Aber 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++.

    C++ und dbExpress

    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???


Anmelden zum Antworten