Announcement

Collapse
No announcement yet.

Problem mit SQLDataAdapter.Update

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

  • Problem mit SQLDataAdapter.Update

    Hallo,

    in meiner Anwendung hat der Anwender die Möglichkeit über einen BindingNavigator die Datensätze durchzuklicken und bei Bedarf über die angebundenen Textboxen zu ändern. Beim Speichern über SQLDataAdapter.Update() habe ich nun folgendes Problem: Es reicht schon aus, dass der Anwender sich durch eine Zeile geklickt hat, damit ein Update darauf ausgeführt wird, auch wenn gar keine Änderungen vorgenommen worden sind.

    Kann mir jmd. weiterhelfen, wie ich das abstellen kann?

    Gruß
    Daniel

  • #2
    Ich gehe davon aus, dass du dein DataAdapter über ein DataSet befüllst.
    Es gibt die Möglichkeit DataSet.HasChanges abzufragen und darauf zu reagieren...

    Comment


    • #3
      Ja, genau, so mache ich es. Das witzige ist nur, dass HasChanges auch meint es wären Änderungen da, wenn ich nur durch die Datensätze klicke...

      Ich habe auch schon eingebaut, dass ich manuell die Änderungen prüfe und dann versucht über

      _ds.Tables(0).Rows.Item(Pos).AcceptChanges()

      den RowState zu setzen. Der RowState ist dann auch korrekt gesetzt, wenn ich ihn danach abfrage, aber das Update erfolgt immer noch.

      Gruß
      Daniel

      Comment


      • #4
        Poste mal etwas Code wie du die Daten bindest und den DA füllst....etc.

        Comment


        • #5
          Also...

          Dim _cmd As New SqlCommand(_sql, _cn)
          Dim _da As SqlDataAdapter = New SqlDataAdapter(_cmd)
          _da.Fill(_ds, "Mitarbeiter")
          Dim _dv as new DataView
          _dv.Table = _ds.Tables.Item("Mitarbeiter")
          Dim _bmb as BindingManagerBase
          _bmb = CType(BindingContext(_dv), CurrencyManager)
          dg_Datensaetze.DataSource = _dv
          bs_Mitarbeiter.DataSource = _dv ' BindingSource
          bn_Mitarbeiter.BindingSource = bs_Mitarbeiter ' BindingNavigator

          ...

          Me.tb_Personalnummer.DataBindings.Add(New Binding("Text", _dv, "ID_Personalnr", True))
          Me.tb_Name.DataBindings.Add(New Bnding("Text", _dv, "Name", True))
          Me.tb_Vorname.DataBindings.Add(New Binding("Text", _dv, "Vorname", True))
          Dim bStundensatz As New Binding("Text", _dv, "Stundensatz", True)
          bStundensatz.FormatString = "F2"
          Me.tb_Stundensatz.DataBindings.Add(bStundensatz)
          Me.chk_Aktiv.DataBindings.Add(New Binding("Checked", _dv, "Aktiv", True))

          ...

          Speichern:

          _transaction = _cn.BeginTransaction

          _bmb.EndCurrentEdit()
          bs_Mitarbeiter.EndEdit()

          Dim _ucmd as new SqlCommand
          _ucmd.Connection = _cn
          _ucmd.Transaction = _transaction
          _ucmd.CommandText = " UPDATE tbl_Mitarbeiter " & _
          ...
          " Datum_Aenderung=getDate(), " & _
          ...

          _da.UpdateCommand = _ucmd

          _da.UpdateCommand.Parameters.Add("@Personalnummer" , SqlDbType.Int, 10, "ID_PersonalNr")
          _da.UpdateCommand.Parameters.Add("@Name", SqlDbType.VarChar, 50, "Name")
          _da.UpdateCommand.Parameters.Add("@Vorname", SqlDbType.VarChar, 50, "Vorname")
          _da.UpdateCommand.Parameters.Add("@StdSatz", SqlDbType.Money, 10, "StundenSatz")
          _da.UpdateCommand.Parameters.Add("@Aktiv", SqlDbType.Bit, 1, "Aktiv")
          _da.UpdateCommand.Parameters.Add("@PersonalNrAende rung", SqlDbType.Int).Value = _PersonalNr_Aenderung

          _sourceParam = _da.UpdateCommand.Parameters.Add("@PersNrVorher", SqlDbType.Int)
          _sourceParam.SourceColumn = "ID_PersonalNr"
          _sourceParam.SourceVersion = DataRowVersion.Original

          _da.Update(_ds, "Mitarbeiter")

          _transaction.Commit()

          Comment


          • #6
            Wie wird dein Speichern aufgerufen...?

            du gibst dort ein

            Code:
            _bmb.EndCurrentEdit()
            bs_Mitarbeiter.EndEdit()
            in diesem Moment wird angewiesen das "Änderungen" übernommen werden sollen.

            Du musst entscheiden wann ist BeginnEdit und wann EndEdit......

            Comment


            • #7
              Was meinst Du mit

              Wie wird dein Speichern aufgerufen...?
              Du meinst sicherlich nicht per "Button-Click", oder?

              Das

              Code:
              _bmb.EndCurrentEdit
              hatte ich eingefügt, weil Änderung am aktuellen nicht übernommen worden sind, wenn ich direkt auf Speichern gegangen bin.

              Wann / wie muss ich entscheiden, wann BeginnEdit und EndEdit ist? Die Bindingsource stellt nur "EndEdit" zur Verfügung...

              Comment


              • #8
                Wie rufst du das Speichern auf...?

                Per Button oder wird das durch ein Ereignis ausgelöst...?

                Wie wird dein nächster Datensatz abgerufen...?

                Ohne Button
                Versuch evtl. Nach dem "Change" Datensatz ein Flag zu setzten, über die Textboxen ( ChangeText ) das Flag zu ändern - wenn Änderung erfolgt, anhand des Flags EndEdit zu setzten oder nicht.

                Comment


                • #9
                  Das Speichern wird über einen Button aufgerufen.
                  Das wechseln der Datensätze erfolgt auch über Buttons, und zwar über

                  Code:
                  BindingSource.Position += 1
                  Ehrlich gesagt verstehe ich Deine letzte Ausführung nicht. Es ist kein Problem manuell festzustellen, ob ein Datensatz wirklich geändert wurde, aber das muss ich mir dann ja für jeden Datensatz merken. Und beim Updatecommand kann ich ja nicht sagen, jetzt aktualisiere den und den nicht. Ich habe schon versucht, die entsprechenden Datensätze mit

                  Code:
                  _ds.Tables("Tabelle").Rows.Item(Pos).AcceptChanges()
                  zu markieren, aber das hilft auch nicht. Wenn ich den Rowstate danach abfrage ist dieser korrekt gesetzt, aber das Update wird trotzdem ausgeführt.
                  Halt bei allen Datensätzen die ich im Form über die Buttons durchgeklickt habe. Bei allen anderen nicht.

                  Comment


                  • #10
                    Vielleicht kannst du hier was mit anfangen....:

                    Code:
                     If dsData.HasChanges = True Then
                          Dim cnn As New SqlConnection(PstrConnString)
                          Dim daNewData As New SqlDataAdapter(strCmdString, cnn)
                          Dim cmdBldr As New SqlCommandBuilder(daNewData)
                    
                          Try
                            If cnn.State = ConnectionState.Closed Then cnn.Open()
                          Catch ex As SqlException
                            Windows.Forms.Cursor.Current = Cursors.Default
                            cnn.Close()
                            cnn.Dispose()
                            MsgBox(ex.Message)
                            Exit Sub
                          End Try
                    
                          Try
                    'nur geänderte Datensätze....
                            daNewData.Update(dtData.GetChanges)
                    
                          Catch ex As SqlException
                            Windows.Forms.Cursor.Current = Cursors.Default
                            MsgBox(ex.Message, MsgBoxStyle.Critical, "Update")
                    
                          Finally
                    
                            If Not IsNothing(cmdBldr) Then cmdBldr.Dispose()
                            If cnn.State = ConnectionState.Open Then cnn.Close()
                            cnn.Dispose()
                    
                             Windows.Forms.Cursor.Current = Cursors.Default
                    
                          End Try
                        End If

                    Comment


                    • #11
                      ...im Moment leider noch nicht. So habe ich es auch gemacht jetzt und das leider ohne Erfolg. Er macht immer noch ein Update auf alle Sätze die durchlaufen werden.

                      Comment


                      • #12
                        Hast du auch einen "Neuen DataAdapter" erzeugt....

                        diesem die "alte DataTable" mit "GetChanges" übergeben....
                        und das Update gefahren....


                        Mit GetChanges werden nur die geänderten Datensatze genommen....
                        Es muss aber ein "Neuer DataÁdapter" sein, welchem die Daten übergeben werden.....

                        Comment


                        • #13
                          Hi,

                          das ich einen neuen DataAdapter erstellen musste, wusste ich nicht. Hat aber auch nicht geklappt ;-)

                          Jetzt habe ich aber eine Lösung. Ich musste die ganze Geschichte nochmal etwas anpassen, aber jetzt geht es.

                          Danke für Deine Hilfe!!

                          Comment


                          • #14
                            Schade das es bei dir nicht geklappt hat....

                            Genau den Code benutzte ich auch.... Bei mir gehts.....

                            Comment

                            Working...
                            X