ExecuteSQL Udate löst keine Exception aus



  • Hallo,

    ich schreibe gerade an einer Datenbank Klasse rum und dabei ist mir folgendes aufgefallen.

    Ein "Update" löst bei mir keine Exception aus.
    Wenn ich drüber nachdenke ist das so auch ok. Ist ja kein Fehler wenn kein Datensatz da ist auf wen das zutrifft.

    Aber wie bekomme ich raus, ob "Update" auf einen Datensatz angewandt wurde?
    Vorher mit "select" schauen ist ggf keine Lösung. Bis dahin kann der Datensatz ja gelöscht sein.

    Gibt es dafür eine einfach Lösung?
    Kann ich die Tabelle sperren?

    Stefan



  • Du möchtest wissen, welche Datensätze durch das Update geändert wurden? Oder nur wie viele? Letzteres kann man unter manchen Schnittstellen rauskriegen. Was verwendest du denn? ADO?



  • Cpp_Junky schrieb:

    Du möchtest wissen, welche Datensätze durch das Update geändert wurden? Oder nur wie viele? Letzteres kann man unter manchen Schnittstellen rauskriegen. Was verwendest du denn? ADO?

    Genau, schau mal in Deiner Doku nach. Die meisten System geben bei einem ExecuteSQL() oder wie es auch immer heißt die Anzahl modifizierter Zeilen zurück.
    Alternativ könntest Du den Vorgang in eine Transaktion kapseln. Dann muesstest Du aber Repeatable Read als Isolierungsebene fahren und das solltest Du dann erst mal testen ob es korrekt implementiert ist.

    Edit\ In Repeatable Read sind immer noch Phantomzeilen möglich, also neu eingefügte Zeilen würden auch gleich mit gelöscht werden 🙄



  • Und vorallem welches RDBMS?

    MySQL hat dafür in der API etwas drin.

    IMHO gibts bei MSSQL auch sowas durch einen weiteren SQLQUERY.



  • Hallo,

    entschuldigt die mangelnden Informationen:

    Ich verwende CDatabase für eine ODBC Verbindung zu einer lokalen Access 2007 Datenbank.

    ExceuteSQL liefert keinen Wert zurück, sondern löst bei einem Fehler "nur" eine Exception aus.

    Wenn ein Befehl funktioniert passiert gar nichts.
    Ich möchte einen Eintrag aktualisieren wenn es ihn schon gibt, sonst erstellen.

    Um die Zugriffe so gering wie möglich zu halten dachte ich

    if ExceuteSQL(UPDATE ....) == FALSE)
    ExceuteSQL(INSERT)

    aber das scheint nicht zu gehen.

    und wenn ich vorher ein select mache um nachzuschauen, kann ich auch gleich in insert probieren und bei einem fehler ein update machen.

    Stefan


Anmelden zum Antworten