Announcement

Collapse
No announcement yet.

Änderungen von DataGrid übernehmen

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

  • Änderungen von DataGrid übernehmen

    Hallo,

    wie kann ich auf schnelle, effektive und vor allem funktionelle Weise geänderten Daten aus dem DataGrid in der Datenbank abspeichern.

    bisher dachte ich das es ausreicht das dazugehörige DataSet nutze:

    # dataset.acceptchanges()
    # sqldataadapter.update(dataset, "Tabellenname")
    # datagrid.refresh()

    leider schreibt er aber nichts in die Datenbank sondern die Änderungen sind nur im DataGrid sichtbar und auch nur solange bis das Programm beende!
    Die Daten schreibe ich einmal ins DataGrid und bei neuen Daten sogar direkt ins DataSet mit der

    # DataSet.Tabelle.AddTabelleRow(Argumente..., true)

    Was mache ich falsch / muß ich noch tun???

    mfG Jörg

  • #2
    Hallo,

    >Was mache ich falsch

    mit dem Aufruf von <b>AcceptChanges</b> werden alle in der Zwischenzeit durchgeführten Änderungen verworfen und das DataSet in den gleichen Zustand zurückversetzt, der nach dem Aufruf der Methode <b>Fill</b> vorlag. Der nachfolgende Aufruf von <b>Update</b> findet daher keine Änderungen vor, die vom DataAdapter eingearbeitet werden müssten.

    Nur dann, wenn man für die Aktualisierung nicht auf den DataAdapter zurückgreift, sondern alles "zu Fuß" über Command-Objektinstanzen selbst erledigt, muss man AcceptChanges von Hand aufrufen. Ein weiterer Sonderfall liegt vor, wenn man Datenmengen aus mehreren DataSets "zusammenmischen" will.

    P.S - Zur Erinnerung: ADO.NET verwendet eine getrennte Architektur, bei der während der Bearbeitung keine Datenbankverbindung besteht. Alle Änderungen, die der Anwender vornimmt, passieren nur im Speicherabbild des DataSets. Sollen diese Änderungen später in der originalen Datenbank eingearbeitet werden, so erfolgt dies in verschiedenen Phasen:

    1. Das DataSet wird vom DataAdapter mit Daten gefüllt (Methode Fill)

    2. Der Benutzer oder das Programm ändert Datensätze im DataSet. Über einen speziellen Merker wird der aktuelle Zustand jedes Datensatzes gespeichert.

    3. Das DataSet arbeitet die geänderten Datensätze über den DataAdapter (<b>Update</b>-Methode) in die originale Datenbank ein, oder nutzt separate Command-Objektinstanzen, um die Aktualisierungen einzuarbeiten. Die Update-Methode des DataAdapter löst immer dann automatisch eine DBConcurrencyException aus, wenn von der UPDATE, INSERT oder DELETE-Anweisung 0 Datensätze betroffen waren (in diesem Fall muss in der Regel ein anderer Benutzer zuvorgekommen sein).

    4. Das DataSet muss den eigenen Zustand aktualisieren, indem alle Datensätze wieder den Merker für den ungeänderten Zustand erhalten (DataSet-Methode <b>AcceptChanges</b>). Damit das nicht vergessen wird, ruft ADO.NET in den DataAdapter-Methoden Fill und Update <b>automatisch</b> auch die DataSet-Methode AcceptChanges auf.
    &#10

    Comment


    • #3
      Danke jetzt denke ich hab ichs, wenn nicht dann auf ein Neues

      Comment


      • #4
        Ok, jetzt gehts

        Mal noch 'ne andere Frage: Welche Eigenschaft vom Datagrid gibt mir den letzten Zeilenindex an.

        Mit VisibleRowCount bekomme ich die Anzahl wieviele Zeilen im Moment angezeigt werden aber mit welchem Index kann ich die letzte Zeile des DataGrids referenzieren (am besten noch den letzten Datensatz).

        Danke im Voraus

        mfG Jör

        Comment


        • #5
          Ok, jetzt gehts

          Mal noch 'ne andere Frage: Welche Eigenschaft vom Datagrid gibt mir den letzten Zeilenindex an.

          Mit VisibleRowCount bekomme ich die Anzahl wieviele Zeilen im Moment angezeigt werden aber mit welchem Index kann ich die letzte Zeile des DataGrids referenzieren (am besten noch den letzten Datensatz).

          Danke im Voraus

          mfG Jör

          Comment


          • #6
            Ok, jetzt gehts

            Und wie lösche ich so eine Zeile wieder aus der Datenbank über das DataGrid/Dataset?

            Mal noch 'ne andere Frage: Welche Eigenschaft vom Datagrid gibt mir den letzten Zeilenindex an.

            Mit VisibleRowCount bekomme ich die Anzahl wieviele Zeilen im Moment angezeigt werden aber mit welchem Index kann ich die letzte Zeile des DataGrids referenzieren (am besten noch den letzten Datensatz).

            Danke im Voraus

            mfG Jör

            Comment


            • #7
              Hallo,

              &gt;Und wie lösche ich so eine Zeile wieder aus der Datenbank über das DataGrid/Dataset?

              Der Aufruf der Methode <b>Delete</b> entfernt eine DataRow-Objektinstanz nicht aus der DataTable, sondern markiert nur den <b>RowState</b>-Wert als gelöscht. Nur so kann der DataAdapter später aus diesem RowState-Wert eine entsprechende DeleteCommand-Anweisung ausführen. Wenn ein DataRow-Objekt vollständig entfernt werden soll, muss entweder <b>Remove</b> oder <b>RemoveAt</b> bemüht werden (das Entfernen aus dem DataSet führt aber dazu, dass dieser Datensatz nicht aus der Datenbank gelöscht werden kann). Während Remove ein DataRow-Objekt erwartet, um es zu löschen, kommt RemoveAt mit dem Index-Wert des Objekts in der Rows-Kollektion aus. Die Methode <b>Clear</b> der Rows-Kollektion räumt alle Datensätze ab.

              Das Löschen des "aktuellen Datensatzes" könnte in VB.NET dann in einem Beispiel so aussehen (der Datensatz wird im DataSet nur als "gelöscht" markiert und erst beim nächsten Update-Aufruf des DataAdapters auch aus der Datenbank entfernt):

              <pre>

              Dim aCM As CurrencyManager
              <br>
              Private Sub ButtonFill_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonFill.Click
              Me.SqlDataAdapter1.Fill(Me.DataSet11)
              aCM = CType(Me.BindingContext(Me.DataSet11, "MailAdressen"), CurrencyManager)
              End Sub
              <br>
              Private Sub ButtonPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonPrev.Click
              aCM.Position -= 1
              End Sub
              <br>
              Private Sub ButtonNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNext.Click
              aCM.Position += 1
              End Sub
              <br>
              Private Sub ButtonDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDelete.Click
              Dim iDelPos As Integer
              iDelPos = aCM.Position
              Me.DataSet11.MailAdressen.Rows(iDelPos).Delete()
              ' zur Kontrolle anzeigen
              Me.StatusBar1.Text = iDelPos.ToString
              End Sub

              </pre>
              Als Alternative zum Aufruf der Delete-Methode der DataRow-Instanz steht auch die Methode <b>RemoveAt</b> des <B>CurrencyManagers</b> zur Verfügung. Auch in diesem Fall sorgt ein späterer Update-Aufruf des DataAdapters dafür, dass eine DELETE-Anweisung für diesen Datensatz zur Datenbank geschickt wird. Der Grund dafür besteht darin, dass diese Methode bei Klassen, die das Interface IList implementieren (also auch bei strongly typed DataSets) in Wirklichkeit Delete aufruft und die DataRow-Instanz nicht wirklich entfernt, sondern über den RowState nur als gelöscht markiert.
              <pre>

              Private Sub ButtonRemoveAt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRemoveAt.Click
              Dim iDelPos As Integer
              iDelPos = aCM.Position
              aCM.RemoveAt(iDelPos)
              Me.StatusBar1.Text = iDelPos.ToString
              End Sub

              </pre>

              &gt;..am besten noch den letzten Datensatz...

              Das DataGrid ist nur die visuelle Anzeige der Datenmenge. Bei ADO.NET gibt es im Gegensatz zu den bisher gewohnten Techniken <b>keinen aktuellen Datensatz</b> mehr, da ADO.NET die Datensätze als Menge betrachtet und somit mit allen Datensätzen gleichzeitig arbeiten kann. Aus diesem Grund gibt es Gebilde wie den <b>CurrencyManager</b>. Die Position des "aktuellen Datensatzes" wird über dessen Eigenschaft <b>Position</b> festgelegt

              Comment

              Working...
              X