Wird Datensatz gerade bearbeitet?



  • Hallo Forum!

    Kurze Frage. Kann ich rausbekommen, wenn in einem Rowset (mit CRecordset) die Edit()-Methode aufgerufen wird, dass dieser Datensatz gerade bearbeitet wird?

    Hintergrund:
    Ich möchte, dass ein Datensatz nicht per Delete() gelöscht werden kann, wenn ein anderer User diesen gerade bearbeitet... also zwischen Edit() und Update()...

    Normallerweise könnte man den Datensatz ja während dieser Zeit mit SetLockMode() sperren (pessimistischer Ansatz). Jedoch unterstützt das meine Datenquelle nicht. Es ist nur der optimistische Ansatz einstellbar, d.h. nur DS sperren während Update()...

    Gibts da noch andere Möglichkeiten???

    Man könnte natürlich ein extra Feld in der Tabelle anlegen, z.B. LOCK [bool]... Wenn jedoch ein Client während der der Edit()-Phase abstürzen würde (kann ja mal unter Windows passieren 🙂 ) könnten die anderen Clients diesen DS nicht mehr löschen. Ist zumindest keine saubere Lösung. Hat jemand eine bessere Idee. Verwende MSSQL (MSDE) per ODBC.

    Danke+Gruß
    Lutz



  • Da ein CRecordset immer nur für eine Instanz des Programmes gültig ist, kannst du als "anderer User" gar nicht abfragen, ob der Datensatz bearbeitet wird.

    Du musst schon mit dem Zusatzfeld in der Tabelle arbeiten.
    Falls mal ein Client abstürtzt, kannst du ja z.B. die User-ID reinschreiben statt einfach einem Bool und dann eine Möglichkeit geben, alle von User X gesperrten Zeilen zu entsperren.



  • Ja, danke. Werd ich so probieren. Schade, dass es da keine vorgefertigte Lösung gibt... Leider gibt die Methode GetRowStatus() nicht zurück, ob ein DS gerade bearbeitet wird.

    Danke+Gruß
    Lutz



  • Wo ich mir gerade nicht so sicher bin:
    Vielleicht unterstützt die MSDE da was. Beim Adminkurs hat der Typ jedenfalls was von Deadlocks erzählt.

    Kannst ja in der Richtung auch nochmal gucken. 🙂



  • Gibts ne Möglichkeit, rauszubekommen wieviel und welche User mit der Datenbank verbunden sind. Über eine CDatabase member oder einen SQL-Befehl?
    Hab schon gesucht, aber nix gefunden..

    Danke+Gruß
    Lutz



  • Keiner eine Idee? 😞



  • Nur einen Suchansatz für dessen Durchführung mir leider die Zeit fehlt:
    Alles, was du mit dem Enterprise-Manager oder anderen GUIs herausfinden kannst, geht auch per T-SQL-Befehl.

    Schau mal, ob deine GUI sowas anbietet. Dann lohnt sich die Suche nach einem Befehl definitiv. 🙂
    Falls du es noch nicht kennst: MSDE in der MSDN und Übersicht ALLER T-SQL Befehle (musst links in der Liste gucken)



  • Notfalls müsstest du eine art ODBC Server schreiben, der die Connection
    dann überwacht, und sich jeweils merkt, welche Tabellen gerade selektiert sind. 😃



  • Danke, Leute.
    Werd mich mal bemühen. Schade, dass sich bei der MSDE dass sperren der Datensätze während der Bearbeitung nicht möglich ist... Macht ja ein heiden Arbeit...

    Danke+Gruß
    Lutz



  • Sowas ist imho auch bei Oracle nicht möglich. Und das ist dann doch der "Rolls Royce" unter den DBMS. 😉



  • Und warum nicht würde mich mal interessieren. Schließlich ist es doch wichtig, dass ein Datensatz der gerade von jemanden bearbeitet wird nicht gelöscht werden kann...oder etwa nicht?

    Gruß



  • Hast du in der Referenz mal unter USER geschaut? Lies mal und geh auch den Links nach.
    Ich denke, das könnte dir auch helfen. 🙂



  • Dank dir... habs gefunden.

    -> T-SQL: EXEC sp_helpuser

    Gruß


Anmelden zum Antworten