Announcement

Collapse
No announcement yet.

Probleme mit UpdateCommand

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit UpdateCommand

    Hi Leute,

    wenn ich folgenden Code ausführe passiert
    rein garnichts!
    <PRE>
    Dim _upd_cmd As New OleDbCommand

    _upd_cmd.CommandText = "UPDATE tbl_PLZ " & _
    "SET ID_PLZ = @PLZ, " & _
    "Ort = @Ort, " & _
    "Ortsteil = @Ortsteil " & _
    "WHERE ID_PLZ = @PK_PLZ"

    _upd_cmd.Connection = _einstellungen.DatenbankConnection

    _upd_cmd.Parameters.Add("@PLZ", OleDbType.VarChar).Value = tb_Postleitzahl.Text
    _upd_cmd.Parameters.Add("@Ort", OleDbType.VarChar).Value = tb_Ort.Text
    _upd_cmd.Parameters.Add("@Ortsteil", OleDbType.VarChar).Value = tb_Ortsteil.Text
    _upd_cmd.Parameters.Add("@PK_PLZ", OleDbType.VarChar).Value = _suchergebnis.Postleitzahl

    _da.UpdateCommand = _upd_cmd

    _einstellungen.DatenbankConnection.Open()
    _da.Update(_ds, "Ort")
    _einstellungen.DatenbankConnection.Close()
    </PRE>

    Es wird keine Exception ausgelöst, aber es ändert sich auch nichts in der Datenbank!

    Kann mir jmd. weiterhelfen?

    Danke & Gruß,
    Daniel

  • #2
    Hallo,

    &gt; Es wird keine Exception ausgelöst, aber es ändert sich auch nichts in der Datenbank!

    das kann so auch nicht funktionieren. Der OleDataAdapter kommt <b>nur</b> dann ins Spiel, wenn die vom Anwender am DataSet vorgenommenen Änderungen beim Aufruf der Methode <i>Update</i> auch in die Datenbank zurückgeschrieben werden sollen. Der OleDataAdapter schaut sich dazu den Status jedes im DataSet geänderten Datensatzes an, um dann die dazugehörende Command-Instanz auszuführen.
    <br><br>
    Wenn es nur darum geht, mit einer UPDATE-Anweisung die Datenbanktabelle zu bearbeiten, reicht die OleDbCommand-Instanz allein aus. Anstelle von OleDataAdapter.Update wird die OleCommand-Instanz direkt ausgeführt:
    <pre>
    _upd_cmd.ExecuteNonQuery()
    </pre&gt

    Comment


    • #3
      Hi Andreas,

      darüber hatte ich es dann auch hinbekommen!
      Trotzdem danke für den Hinweis!

      Ich lade allerdings erst den zu bearbeitenden Datensatz über eine DataAdapter, ein DataSet und eine DataTable und binde es an meine Formular-Elemente. Ich hatte mir erhofft, das der Datensatz dann automatisch in der Datenbank gesperrt wird. Allerdings ist diese vorgehensweise über das DataSet etc. in diesem Formular eigentlich überflüssig, da dort nur ein Datensatz bearbeitet wird. Aber was mache ich nun mit der Sperre des Datensatzes?? Ach ja, ich verwende Access...

      Gruß
      Danie

      Comment


      • #4
        Hallo,

        das DataSet arbeitet im Offline-Modus, d.h. nach dem Aufruf der Methode Fill vom OleDbDataAdapter kann die Verbindung zur ACCESS-Datenbank geschlossen werden. Beim optimistischen Sperrverfahren geht man davon aus, dass sich zwei Benutzer nicht in die Quere kommen. Zur Sicherheit lässt man dann aber beim UPDATE die Feldwerte in der WHERE-Einschränkungen gegenüber dem originalen Zustand vergleichen, so dass ein UPDATE nur dann einen Datensatz aktualisiert, wenn in der Zwischenzeit kein anderer Benutzern den Wert geändert hat. War das aber doch der Fall, ist vom UPDATE kein Datensatz betroffen, so dass ADO.NET eine entsprechende Exception wirft, die vom Programm ausgewertet werden kann. Man kann nun den betroffenen Datensatz einzeln aus der Datenbank nachladen, um sich alle 3 Zustände anzusehen: <br>
        1. Der originale Wert zum Zeitpunkt des eigenen Fill-Aufrufs <br>
        2. Den aktuellen Wert des Benutzers (gewünschte Änderung</b>) <br>
        3. Den aktuellen Datenbankwert (vom anderen Benutzer), der das eigene UPDATE blockiert <br>
        Je nach den Geschäftsregeln kann man dann entweder das Update mit dem Hinweis auf die neuen Daten ablehnen oder das eigene UPDATE beim zweiten Aufruf erzwingen, indem die betroffene DataRow-Instanz angepasst wird.

        In diesem Szenario wird eine pessimistische Datensatzsperre nicht mehr gebraucht ;-)
        &#10

        Comment


        • #5
          Danke für den Hinweis!

          Ich habe es jetzt so gelöst, dass ich vor dem Speichern des Datensatzes von diesem in der Datenbank das Änderungs-Datum noch einmal lese. Dieses vergleiche ich dann mit dem Änderungs-Datum, welches ich beim ersten Auslesen das Datensatzes zur Bearbeitung bekomme.

          Gruß
          Danie

          Comment

          Working...
          X