Announcement

Collapse
No announcement yet.

Daten neben der BindingSource aus DataTable aktualisieren

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

  • #16
    ok
    das hat funktioniert
    nur jetzt habe ich die seltsamsten Ergebnisse

    kurz zusammenfassend
    ich hab also eine Kundentabelle an Textfelder verknüpft über die Bindingsource zur Überprüfung der Daten habe ich noch ei Datagridview mit verbunden an die BS.
    und ein DGV das ich per knopfdruck direkt neu fülle aus der datenbank.

    mein Löschenbutton macht dieses zusammengefasst Command

    Dim cmd As New SqlCommand("Update tblKunde set dtAusgeblendet = -1 where dtkundenNr=" & TextBoxKundenNr.Text & ";Select * from tblKunde where dtAusgeblendet = 0", gbl.conn) '

    daKunde.UpdateCommand = cmd
    daKunde.Update(dtKunde)

    jetzt meine Testergebnisse:

    Programm start
    der erste Datensatz wird angezeigt ich drücke auf löschen und nichts passiert! zur Prüfung lade ich per Knopfdruck die Daten neu in mein DGV2 auch hier keine Änderung


    Test 2

    ich navigiere über bs.movenext auf den zweiten Datensatz drücke auf löschen
    im ersten Moment geschieht auch nix. nach Aktualisierung des DGV2 sehe ich das der Datensatz gelöscht wurde. aber wird trotzdem noch in den mit der Bindingsource verbundenen Controls angezeigt...

    test 3
    programm wieder neugestartet
    ich navigiere auf den dritten Datensatz drücke auf löschen

    in den Textfeldern verschwindet der Satz nach aktualisierung des DGV2 sehe ich das der satz gelöscht wurde (kurzes Erfolgserlebnis)

    aber im DGV1 (das mit der Bindingsource verbundet ist) haben sich die ersten 3 Einträge in den allerersten der Tabelle geändert. was beim Navigieren durch die Textfelder bestätigt wird.

    Beispiel:
    vorher
    ID - Kundennr - Name
    1 - 1234 - meyer
    2 - 5234 - müller
    3 - 3423 - Schmidt

    nach dem Löschen des dritten satzes

    ID - Kundennr - Name
    1 - 1234 - meyer
    1 - 1234 - meyer
    1 - 1234 - meyer


    hehe
    der Absolute wahnsinn und nicht zu erklären :-D

    Comment


    • #17
      Du solltest nochmal genau nachlesen was DataAdapter.Update genau tut. Weiterer Link aus der Hilfe zum Thema.

      Kernproblem ist 'Zitat aus der MSDN'

      Ruft für jede Zeile im angegebenen DataSet einer DataTable mit dem Namen "Table", die eingefügt, aktualisiert oder gelöscht wird, die INSERT-Anweisung, die UPDATE-Anweisung bzw. die DELETE-Anweisung auf.
      Wo ist in deinem SQL der Bezug zu den Daten in der Datatable.

      Comment


      • #18
        ich verstehs einfach nicht...

        und was meinst du mit :
        Wo ist in deinem SQL der Bezug zu den Daten in der Datatable.


        ich glaub ich ruf schon mal auf dem Arbeitsamt an

        Comment


        • #19
          Du hast dein SQL so geschrieben das es genau einen Wert anhand des Inhalts einer Textbox ändert. Deine Datatable und die Daten darin sind vollkommen unbeteiligt. Du könntest dein SQLCommand also einfach so ohne DataAdapter absetzen.

          Ich fasse mal kurz zusammen was du eigentlich aus der von mir verlinkten Doku schon entnommen haben solltest.

          Was du mit ist DataAdapter eigentlich machst ist für jeden in der Datatable befindlichen Datensatz der als Modified, Added, Deleted markiert ist das entsprechende SQL auszuführen(Ein DataAdapter hat dafür InsertCommand, UpdateCommand, DeleteCommand). Du würdest also in deinem Fall in der Datatable die dtAusgeblendet Spalte auf -1 setzen und dann Update am DataAdapter aufrufen. Der DataAdapter läuft dann über die Datensätze in der DataTable findet dann zu Beispiel deine geänderte DataRow(die steht auf Modified darum wird das UpdateCommand verwendet) füllt die Werte aus der DataRow über Parameter in das SQL und führt es aus. Falls von diesem SQL Daten in den Parametern zurückgekommt füllt es diese wieder zurück in einen Datensatz der DataTable(dafür muss die Datatable einen eindeutigen Wert enthalten den Primary Key und der muss ebenfalls auch aus dem SQL zurückkommen)

          Ich habe gerade mal einfach über den Dataset Designer einen Adapter auf die Northwind Datenbank angelegt dort sähe dann das SQL des UpdateCommands so aus.
          [Highlight=SQL]
          UPDATE [dbo].[Region] SET [RegionID] = @RegionID, [RegionDescription] = @RegionDescription WHERE (([RegionID] = @Original_RegionID) AND ([RegionDescription] = @Original_RegionDescription));
          SELECT RegionID, RegionDescription FROM Region WHERE (RegionID = @RegionID)[/Highlight]

          Du siehst entsprechend den Spaltenbezeichnungen in der DataTable sind Parameter angelegt worden und der Select liefert die konkreten Spaltenbezeichnungen zurück damit auch klar ist wohin die per Select gelesenen Daten wieder hin müssen. Entsprechend müsste du deine manuell erstellten SQL Statements für Insert,Update,Delete gestalten.

          Comment


          • #20
            danke für die zusammenfassung, die verstehe ich besser als den Text hinter deinem Link :-D

            allerdings ändert diese anpassung nichts

            Code:
            Dim cmd As New SqlCommand("Update tblKunde set dtAusgeblendet = -1 where idkunde=" & LabelKundenNr.Tag & ";Select idkunde, dtkundenNr, dtZuname, dtVorname, dtAusgeblendet from tblKunde where idkunde=" & LabelKundenNr.Tag, gbl.conn)
            ich navigiere 5datensätze durch die tabelle und nach dem löschen sehe ich in dem verbundenen DGV das alle durch das navigieren berührten Datensätze genau dem geänderten entsprechen


            was mir zusätzlich aufgefallen ist wenn ich einfach mal ein
            Dim m As Integer = daKunde.Update(dtkunde)
            mach und mir M ausgeben lasse sehe ich das nur durch das navigieren von 8 Datensätzen 8 Änderungen anfallen?!

            da liegt doch dann irgendwo der Fehler ?
            Zuletzt editiert von Ben Graf; 15.12.2010, 16:03.

            Comment


            • #21
              mach und mir M ausgeben lasse sehe ich das nur durch das navigieren von 8 Datensätzen 8 Änderungen anfallen?!

              da liegt doch dann irgendwo der Fehler ?
              Änderst du beim navigieren irgend was an den Daten? Der Update wird auf jede Zeile ausgeführt die auf Modified steht. Du solltest das navigieren mal debuggen und dir, von den Datenzeilen, mal die RowState Property ansehen. Wenn der auf Modified steht hast du durch irgendeine Aktion den Datensatz geändert und beim Aufruf von DataAdapter.Update wird eben das SQL ausgeführt für jede Zeile die auf Modified steht.

              Comment


              • #22
                ok also die datensätze werden auf Modified gesetzt sobald ich darüber navigiere.
                aber ich mache ja nichts ausser


                bs.movenext()


                und nach dem laden der Daten habe ich sie So verbunden

                TextBoxKundenNr.DataBindings.Add("Text", bs, "dtKundenNr")

                Comment


                • #23
                  aber ich mache ja nichts ausser


                  bs.movenext()
                  Das würde nicht zum Ändern des RowStates führen. Irgendwas anderes machst du noch. Jetzt kommst auf deine Debugging Fähigkeiten an die Stelle zu finden

                  Comment


                  • #24
                    Zwischenstand:

                    also es hat irgendwas mit den Textboxen zu tun.
                    Nehme ich die Bindings von den Textboxen weg, passiert beim navigieren durch das Test-Grid kein Modify im Rowstate.

                    ich bin weiter auf der Suche :-)

                    meine Löschfunktion habe ich jetzt auch geändert (ich glaube so langsam fällt der Groschen)

                    Dim rw As DataRow = dtKunde.Rows(DataGridView1.CurrentRow.Index)
                    Dim ikunde As Long = rw("idKunde")
                    rw("dtAusgeblendet") = True
                    Dim m As Integer = daKunde.Update(dtKunde)

                    damit sind die modifys in den nicht markierten Spalten vorerstmal uninteressant, aber da meine haupt Select SQL ja

                    select ... dtausgeblendet = false ... ist,
                    verstehe ich nicht warum nach dem Update im Adapter der Satz nicht ganz aus dem Grid verschwindet ?

                    ich bin nicht alleine mit dem Problem :-D
                    http://social.msdn.microsoft.com/For...-68df3ba7a138/
                    Zuletzt editiert von Ben Graf; 16.12.2010, 11:43.

                    Comment


                    • #25
                      select ... dtausgeblendet = false ... ist,
                      verstehe ich nicht warum nach dem Update im Adapter der Satz nicht ganz aus dem Grid verschwindet ?
                      Die Row ist bereits in der DataTable und verschwindet nicht einfach weil es nicht zu deinem SQL passt. Die DataTable ist ja von deiner Datenquelle unabhängig und weiß nichts von SQL. Die müsstest du also manuell aus der Datatable werfen. Alternativ hat die BindingSource eine Filter Property. Da könntest du diese Rows wegfiltern so das man sie in den gebundenen Controls nicht sieht. Syntax des Filters entspricht in etwa der einer Where Klausel in SQL.

                      Comment


                      • #26
                        das Filtern habe ich auch schon getestet wenn ich den ersten Datensatz lösche funktionierts aber ab dann löscht er nie den markierten sondern einen davor

                        ich versuche mal den satz aus der datatable zu löschen


                        also ein row.delete löscht den Satz komplett, auch nach einem Update aus der Datenbank. Da ist dann doch irgendwie Filtern angesagt


                        bs.position (bei bs.filter ....) ist nach dem löschen immer kleiner als die markierte position
                        Zuletzt editiert von Ben Graf; 16.12.2010, 13:11.

                        Comment


                        • #27
                          also nach langem Testen habe ich jetzt eingegrenzt warum beim Filter so seltsame ergebnisse kommen

                          Hier mein Beispiel:
                          bs.filter= "dtAusgeblendet = 0"

                          tabelle:

                          1 - MusterMann
                          2 - Müller
                          3 - schmidt
                          4 - meyer
                          5 - graf
                          6 - Groß

                          im gebundenen Grid steht der Zeiger auf schmidt

                          ich drücke auf löschen:

                          Dim rw As DataRow = dtKunde.Rows(bs.Find("dtkundenNr", TextBoxKundenNr.Text))

                          MsgBox("idKunde " & rw("idkunde") & " Kunden " & rw("Name") & " " & rw("dtZuname"))

                          rw("dtAusgeblendet") = True
                          Dim m As Integer = daKunde.Update(dtKunde)
                          MsgBox("anzahl geänder:" & m.ToString)

                          Ausgabe der Msgbox
                          idkunde = 3 kunde Schmidt

                          der Datensatz verschwindet und das Grid steht auf 4 - Meyer

                          ich drücke wieder auf Löschen, nichts passiert außer die anzeige der MSgBOx
                          idkunde = 3 kunde Schmidt

                          gehe ich im Grid auf 5 - Graf und lasse mir nur die MsgBox ausgeben
                          Ausgabe 4 - Meyer

                          gehe ich auf 6 - Groß, Ergebnis 5 - Graf

                          gehe ich auf die 2 - Müller ist auch die Ausgabe identisch

                          also scheinbar werden die ID's ab dem gelöschten Satz um eins verringert

                          Comment


                          • #28
                            also scheinbar werden die ID's ab dem gelöschten Satz um eins verringert
                            Ein ändern eines Datensatzes ändert nichts an einem anderen ... außer du hast es so programmiert.

                            Comment


                            • #29
                              ne du verstehst mich falsch
                              das gird markiert nach dem löschen den nächsten Satz.

                              über das
                              Dim rw As DataRow = dtKunde.Rows(bs.Find("dtkundenNr", TextBoxKundenNr.Text))
                              findet

                              http://short4u.de/4d0a1487e26ff

                              Comment


                              • #30
                                Ich verstehe immer noch nicht. Denn Datensatz mit Find zu suchen ist aber unnötig. Deine aktuelle Row ist einfach bs.Current(musst du nur auf DataRow casten).

                                Comment

                                Working...
                                X