Rückgabewert von SQL Funktionene in MFC abfragen



  • hallo
    habe folgendes Problem :
    hab den MSSQl Server 200 und hab dort einige Funktionen und Prozeduren defieniert.
    Verbindung zur Datenbank erfolgt über Klasse CDatabase.
    Mittels
    CDatabase db;
    db.Open(Datenbankname)
    db.ExecuteSQL(prozurename)
    db.Close();

    Nun meine Frage wie kann ich den Rückgabewert der Funktion abfragen

    Vielen Dank
    Mit freundlichen Grüßen
    Basti



  • Schau dir mal CRecordset an. Das sollte dich weiterbringen.

    Gruß





  • Danke für die schnelle Antwort



  • Hallo brauche doch noch mal Hilfe.
    Hab mir Crecordset angesehen aber so richtig nichts gefunden um den Rückgabewert abzufangen.

    Mein Problem noch einmal etwas genauer.
    Hab auf datenbank ebene mehrere Funktionen und Prozeduren defieniert, die Rückagbewerte haben. Nun möchte ich per MFC diese Funktionen aufrufen .
    Das habe ich realisiert durch :
    Cdatabase db;
    db.OPen(Datenbank)
    db.ExecuteSql(Prozedureaufruf)
    ....

    Wie kann ich nun den Rückgabewert der SQL - Funktion bekommen.

    Mit freundlichen Grüßen
    Basti



  • Brauche wirklich dingrind Hilfe



  • ExecuteSQL(...) von CDatabase gibt void zurück, egal, was die aufgerufene Prozedur zurück gibt.
    Eine Möglichkeit wäre, den Rückgabewert der Prozedur in eine (Hilfs-) Tabelle zu schreiben und die dann nach ExecuteSQL auszulesen. Keine Ahnung, ob es auch noch eleganter geht...



  • danke für deine Antwort. Diese Möglichkeit habe ich auch schon in Betracht genommen sie hat aber einen Nachteil.
    Meine Functionen dienen zum erstellen , ändern und löschen von Datensaätzen in unterschiedlichen Tabellen.
    Wenn ich nun jede "Aktion" in einer seperaten Tabelle abspeichere muss ich ja wissen welcher Nutzer welche Aktion ausgeführt hat.
    Da das Programm im Netz betrieben werden Soll.

    Trotzdem vielen
    Dank



  • Dann mach doch die Spalte mit in die Tabelle:
    User | Returnwert | Funktionsname | PC | ...
    Das kannst du dir doch frei gestalten.

    Und falls du mit Transactions arbeiten kannst, sieht sowieso kein anderer was sich da tut, bis du Commit machst. 😃

    Solltest du einen eleganteren Weg finden, wird der übrigens in die FAQ aufgenommen - mir ist leider auch nichts bekannt.
    Ich arbeite daher einfach nicht so viel in der Datenbank, sondern mache möglichst viel im Programm. 😞
    Hier und da mal ein Trigger, den Rest macht das Programm. Da stehen zwar jedem Datenbankentwickler die Haare zu Berge, aber es ist pflegeleicht. 😉



  • ähm was erwartest du den für nen Rückgabewert? Bei Fehlern fliegt ne Exception. Die kann/sollte man fangen. Aber ansonsten is ja nix weiter



  • Ich will über die Funktionen datensätze änder einfügen und löschen.
    Diese Datensätze können nur einmal vorkommen. ist der datensatz schon vorhanden gibt die Funktion eine 0 zurück sonst eine 1 . der befehl führt zu keinem fehler bei einem bereits vorhandenen eintrag .

    Vielen Dank



  • Dann wirf den Rückgabewert, den kannst du dann im code fangen. Hat Pellaeon ja schon erwähnt. 🙂



  • Wie realisert man das In der SQL Funktion.
    Kenne nur Return .

    Danke



  • Ich meine "throw" mal gesehen zu haben.



  • Also entweder holst du dir die ODBC-Handles aus der Klasse und benutzt ODBC-API direkt. Würde ich aber als schlechten Weg einstufen.

    Wenn keine Datensätze doppel vorkommen dürfen, dann klingt das nach nem Primary Key -> sprich Tabellenstruktur anpassen.
    Und wenn du jetzt versuchst nen neuen Datensatz anzulegen mit nem PK, den es schon gibt, dann fliegt automatisch ne Exception in CDatabase.



  • Erst einmal Danke,
    das was dur gesagt hast ist richtig und funktioniert auch. ALlerdings sind die Fehlermeldungen auf Englisch und für einen normalen Nutzer nicht Nachzuvollziehen. Habe ich die Möglichkeit dies zu ändern ?

    Vielen Dank



  • Normalerweise kann man in der ODBC Datenquelle eine Sprache einstellen.
    Wenn nicht, hast du vielleicht blos einen englischen Treiber und müsstest einen deutschen suchen.

    Oder du wertest die Fehlernummern aus und gibst eigene Texte aus.
    Die Datenbankmeldungen sind sowieso zu kryptisch für normale User. 😉



  • Bank für diese Hinweise.
    Die Sprache konnte ich verstellen aber leider sind die Fehler immer noch auf Englisch.
    Wie kann ich diese Fehlermeldungen abfangen um eigene zu erzeugen.
    Muss ich das auf Datanbankebene tun oder im Programm

    Danke



  • Das geht im Programm mit

    try
    {
    // mach was in der Datenbank
    }
    catch (CDBException* e)
    {
    	e->ReportError();
    }
    

    Es gibt dann noch TRY und CATCH, aber ob und wo da Unterschiede sind, habe ich noch nicht geguckt. Ich nehme einfach das kleine (ist fauler 😉 ).



  • Danke

    Habe das bei mir so gemacht :

    try
    {
    db.ExecuteSQL(sql_befehl);
    }
    catch (CDBException ex)
    {
    ex.ReportError(MB_OK,1);
    }

    Leider wird immer noch die Standardfehlermeldung der DB angezeigt,

    Danke


Log in to reply