Announcement

Collapse
No announcement yet.

Wie geänderte DataRow in SQL-Datenbank schreiben/updaten?

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

  • Wie geänderte DataRow in SQL-Datenbank schreiben/updaten?

    Hallo Forum,

    ich habe folgendes Problem. Ich eine geänderte DataRow in meiner SQL-Datenbank updaten. Dazu benutze ich folgenden Code:

    Code:
       Friend Sub DatensatzSpeichern(ByVal DatenSatz As System.Data.DataRow)
            Dim DatenAdapter As SqlCeDataAdapter
            Dim SQLcmdB As SqlCeCommandBuilder
            Dim SQL_AbfrageString As String = ""
            Dim RowsArray As New List(Of System.Data.DataRow)
    
            Select Case DatenSatz.Table.TableName
                Case "MDEsysOptionen"
                    If DatenSatz.RowState = Data.DataRowState.Modified Then
                        DatenSatz.AcceptChanges()
                        SQL_AbfrageString = "SELECT * FROM MDEsysOptionen WHERE opt_OptionID = '" & DatenSatz.Item("opt_OptionID") & "'"
                    Else
                        Exit Sub
                    End If
            End Select
    
            RowsArray.Add(DatenSatz)
    
            DatenAdapter = New SqlCeDataAdapter(SQL_AbfrageString, GlobaleDaten.var_Datenbank.DatenbankVerbindung)
            SQLcmdB = New SqlCeCommandBuilder(DatenAdapter)
    
            Using DatenAdapter
                DatenAdapter.Update(RowsArray.ToArray)
            End Using
    
        End Sub
    Die Sub wird auch fehlerfrei durchlaufen. Wenn ich nun aber den Datensatz erneut Abfrage sind noch immer die alten Werte, also die Werte wie vor der Änderung enthalten.

    Kann mir jemand sagen was ich falsch mache?

    Ich möchte nicht mit BindingSources und Tableadapter arbeiten. Auch möchte ich nicht jedes Feld einzeln mit der SQL-Update Anweisung ändern.
    Es muss doch möglich sein eine komplette geänderte Row manuell in der datenbank abzudaten oder etwa nicht?

    Vielen Dank für Eure Hilfe im Voraus!

    Gruß,
    Uwe

  • #2
    Code:
    If DatenSatz.RowState = Data.DataRowState.Modified Then     
        DatenSatz.AcceptChanges()
    Übersetzt. Wenn der Datensatz so aussieht als wurde er geändert ändere den Zustand der Row dahingehend das er ungeändert aussieht.
    Danach versuchst du den Datensatz in die Datenbank zu schreiben. Es gibt aber nichts in die Datenbank zu schreiben du hast das System ja vorher davon überzeugt das sich der Datensatz gar nicht geändert hat.
    Mit dem jetzigen Code könntest du also nur gelöschte oder neue Datensätze in die Datenbank schreiben.

    Ein AcceptChanges() solltest du also frühestens nach dem Update ausführen.

    Comment


    • #3
      Hallo Ralf,

      vielen Dank für Deine Antwort.
      DatenSatz.AcceptChanges() habe ich erst eingebaut um zu sehen ob sich dadurch was ändert. Leider wird die Datenbank auch ohne diesen Aufruf nicht upgedatet.
      Was könnte denn sonst noch falsch sein? Oder gibt es noch eine andere Möglichkeit eine DataRow in der Datenbank zu aktualisieren?

      Gruß,
      Uwe.

      Comment


      • #4
        Es gibt viele Wege aber DataAdapter.Update ist jetzt nicht der schlechteste. Ein anderer ist dann auch nicht besser wenn man den genauso wenig versteht (soll kein Angriff sein).

        Du solltest mal debuggen ob an deinem Update Commando denn ein zu ändernder Datensatz ankommt (welchen RowState die Datensätze haben) und ob an deinem SqlCeDataAdapter auch das richtige SQL zum inserten, updaten, deleten oder was du jetzt da auch konkret brauchst generiert wurde.

        Comment


        • #5
          Warum definierst du für jede geänderte Zeile ein SELECT-Statement, führst es aus und speicherst dann die Ergebnisse des Selects?
          Wenn schon, dann musst du ein UPDATE auf die geänderten Zeilen machen.

          Falls eine Überlegung hinter deinem Vorgehen steckt, solltest du die evtl näher erklären.

          Comment


          • #6
            @CLL

            Ein DataAdapter(insbesondere einer dem auch ein CommandBuilder zugewiesen ist) generiert aus dem Select passende Insert,Update,Delete Kommandos. Zumindest wenn der Select nicht zu komplex ist. Und das hier ist ein simpler Select * from ...

            Comment


            • #7
              Hallo,

              danke für Eure Antworten!

              @Ralf
              Natürlich habe ich mir das im Debugger bereits angeschaut. Der Datensatz mit den geänderten Spalten kommt am Update-Commando an.
              Im SelectCommand steht auch das Select-Statement das ich zuvor generiert habe. Update-, Insert-, DeleteCommand sind natürlich nicht belegt.
              Hhhm, ich weiß mir echt keinen Rat mehr.

              @CLL
              Ich verstehe nicht so recht was Du meinst. Ich denke, ich habe vielleicht wirklich ein Verständnisproblem, wie der DataAdapter und CommandBuilder arbeiten.
              Ich möchte eine DataRow, die ich ja an die Sub übergebe in der Datenbank speichern/aktualisieren.
              Um die entsprechende Row in der Datenquelle/Datenbank aktualisieren zu können muss ich doch vorher diesen Satz selektieren oder nicht?

              Bei dem von Dir angesprochene UPDATE-Statement muss ich doch über SET alle Felder einzeln ansprechen oder nicht? Das möchte ich vermeiden.
              Ich möchte einfach nur EINEN KOMPLETTEN geänderten "Arbeitsdatensatz" bzw. eine Tabellenzeile in der Datenquelle/SQL-Datenbank, in der entsprechenden Tabelle aktualisieren.

              Gehe ich vielleicht völlig falsch vor?
              Ich habe mich ja gerade deshalb, weil ich die Funktionsweise noch nicht so gut verstehe/blicke, an Euch hier im Forum gewandt.

              Nochmals vielen Dank für Eure Hilfe im Voraus!

              Comment


              • #8
                Hallo Ralf, hallo CLL,

                ich habe es hinbekommen. Es lag lediglich an dem SQL-Select-Statement, was wohl nicht funzte.
                Dies habe ich nun wie nachfolgend abgeändert und nun funktioniert es

                Code:
                    Friend Sub DatensatzSpeichern(ByVal DatenSatz As System.Data.DataRow)
                        Dim DatenAdapter As SqlCeDataAdapter
                        Dim SQLcmdB As SqlCeCommandBuilder
                        Dim SQL_AbfrageString As String = ""
                        Dim RowsArray As New List(Of System.Data.DataRow)
                
                        Select Case DatenSatz.Table.TableName
                            Case "MDEsysOptionen"
                                If DatenSatz.RowState = Data.DataRowState.Modified Then
                                    SQL_AbfrageString = String.Format("SELECT * FROM" & "[{0}]", DatenSatz.Table.TableName)
                                Else
                                    Exit Sub
                                End If
                        End Select
                
                        RowsArray.Add(DatenSatz)
                
                        DatenAdapter = New SqlCeDataAdapter(SQL_AbfrageString, GlobaleDaten.var_Datenbank.DatenbankVerbindung)
                        SQLcmdB = New SqlCeCommandBuilder(DatenAdapter)
                
                        Using DatenAdapter
                            DatenAdapter.Update(RowsArray.ToArray)
                        End Using
                
                    End Sub
                Trotzdem nochmals vielen Dank für Eure Hilfe!!!

                LG,
                Uwe.

                Comment


                • #9
                  ich habe es hinbekommen. Es lag lediglich an dem SQL-Select-Statement, was wohl nicht funzte.
                  Defekt? Dann hätte es eine Exception gen sollen wegen eines ungültigen SQLs. Fehlt dir etwa noch ein sauberes Fehlerhandling Dass solltest du nicht hinterher dranstricken. Es hilft auch schon während der Entwicklung sich solche Ratespiele zu ersparen.

                  Comment


                  • #10
                    Danke, Ralf. Das war mir noch unbekannt. In dieser Weise hatte ich das noch nicht verwendet.

                    Comment

                    Working...
                    X