Announcement

Collapse
No announcement yet.

Abfrageergebnis an bestehendes DGV "anhängen"?

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

  • Abfrageergebnis an bestehendes DGV "anhängen"?

    Hallo zusammen,

    gibt es eine Möglichkeit, ein neues SQL-Abfrageergebnis an ein bestehendes, mit dem Ergebnis einer vorherigen Abfrage gefülltes, DataGridView "anzuhängen", also die Resultate mehrerer Select-Abfragen untereinander in einem DGV anzuzeigen? Hintergrund ist der, dass die Werte in einer ListBox als Bestandteil eines SELECT verwendet werden sollen.
    Wenn ich die ListBox jetzt mit einer Schleife, also so:
    [highlight=vbnet]
    For i = 0 To lstCustNo.Items.Count - 1
    tbTemp.Text = "select * from customers where ZIP like '" & lstCustNo.Items(i) & "'"
    Next i
    [/highlight]
    durchlaufe, wird logischerweise im DGV immer nur der letzte Datensatz angezeigt da sich die Abfrageergebnisse ja im DGV immer wieder überschreiben. Alternative wäre noch, alle einzelnen ListItems zu einem SELECT zusammenzufuddeln.... aber irgendwie fehlt mir da auch der rote Faden...
    Bin für jede Idee dankbar!!!

  • #2
    DataGridView ist ein Control zur Anzeige. Wenn du Daten aus verschiedene Abfragen zusammenfassen willst ist das aber eine Frage der Datenstruktur in der du das Ergebnis der Abfrage hältst und ob die merge-bar ist. Also wie sieht dein Datencontainer aus?(Datatables, irgendein ORM Object, was selbst gebautes etc.)

    Comment


    • #3
      Hallo Ralf,
      in die ListBox können mehrere Kundennummern eingetragen werden, nach denen dann per select in der DB gesucht werden soll (also wirklich nur ein primitives select).
      Das Einfachste(aber bestimmt umständlichste) wäre, das select-commando Stück für Stück aus den einzelnen Items zusammenzusetzen, so etwa:
      tbTemp.Text = "select * from customers where ZIP like '" & Item1 & "' or ZIP like '" & Item2 & "' or ZIP like '" & Item3 usw...
      bis alle Items durch sind. Da ich das aber etwas umständlich finde kam mir der Gedanke mit dem Anfügen der einzelnen Select-Ergebnisse.
      Die Darstellung im DGV sieht dann so aus:
      [highlight=vbnet]
      frmGrid.Show()

      Try
      Application.DoEvents()
      da = New SqlDataAdapter(tbTemp.Text.Trim(), conn)
      da.SelectCommand.CommandTimeout = 120
      dt = New DataTable()
      Application.DoEvents()
      da.Fill(dt)
      frmGrid.grid1.DataSource = dt
      Dim bis As Double = System.Environment.TickCount
      frmGrid.ToolStripStatusLabel1.Text = "Records: " + dt.Rows.Count.ToString() + " (" + ((bis - von) / 1000).ToString() + " s)"
      Application.DoEvents()

      Catch ex As Exception
      MessageBox.Show(ex.Message)
      End Try
      [/highlight]

      Comment


      • #4
        Aus deinem Code errate ich das du eine Datatable benutzt. Datatables haben eine Merge Methode. Wenn du also weitere Daten aus der DB holst fülle sie erstmal in eine andere Datatable und merge anschließend die dann in deine eigentliche Datatable die an dein dataGridView gebunden ist.

        Brauchst du im SQL wirklich LIKE? Sonst wäre ein 'Select * from where ZIP in (ZIP1,ZIP2,.....)' vermutlich am einfachsten und schnellsten.

        Comment


        • #5
          Ich könnte notfalls auch auf das like verzichten, allerdings steh ich dann wieder auf dem Schlauch, wie ich das select-command zusammenbasteln muss. Wie muss ich denn die ListBox durchlaufen bzw. auslesen, dass der jeweilige Zeileninhalt an die passende Stelle im Statement wandert?
          PS: DataTable.Merge hab ich gerade mal versucht umzusetzen, aber irgendwie versteh ich's nicht, dazu fehlt mir aussagekräftiger Beispielcode(der Code bei MSDN enthält mir irgendwie zuviel "Ballast")

          Comment


          • #6
            PS: DataTable.Merge hab ich gerade mal versucht umzusetzen, aber irgendwie versteh ich's nicht, dazu fehlt mir aussagekräftiger Beispielcode(der Code bei MSDN enthält mir irgendwie zuviel "Ballast")
            Der Ballast ist nur das erstellen zweier Datatables von Hand. Es gibt ansonsten nicht viel zu zeigen ist halt nur ein Methodenaufruf.

            Code:
            datatable1.Merge(datatable2, false)
            Danach sind dann die Daten aus datatable2 auch zusätzlich in datatable1.

            Comment


            • #7
              Ich hab das jetzt noch einmal probiert. Da ja im Prinzip für jedes Item in der Listbox eine Abfrage ausgeführt und und an die bestehenden Datensätze angehängt wird hab ich das mit in die Schleife gelegt, also es soll jedes Ergebnis "eingesammelt" & angehängt werden und dann im DGV angezeigt werden:
              [highlight=vbnet]
              For i = 0 To lstCustNo.Items.Count - 1

              tbTemp.Text = "select * from customers where ZIP like '" & lstCustNo.Items(i) & "'"

              Try
              Application.DoEvents()
              da = New SqlDataAdapter(tbTemp.Text.Trim(), conn)
              da.SelectCommand.CommandTimeout = 120

              Dim dtold As New DataTable()
              Dim dtnew As DataTable = dtold.Copy
              dtold.Merge(dtnew, True)

              Catch ex As Exception
              MessageBox.Show(ex.Message)
              End Try

              Next i

              da.Fill(dtold)
              frmGrid.grid1.DataSource = dtold
              frmGrid.MdiParent = frmMenu
              frmGrid.Show()
              [/highlight]
              Allerdings funktioniert es nicht, bei da.Fill meckert VB "Der Wert darf nicht NULL sein". Was mache ich da falsch??

              Comment


              • #8
                Der Code sollte für mein dafürhalten nicht mal kompilieren.

                Code:
                Dim dtold As New DataTable()
                Du definierst dtold in der for Schleife. Das heißt die Sichtbarkeit dieser Variablen ist auf die Schleife begrenzt. Danach existiert die nicht mir. Ein nach der Schleife folgendes

                Code:
                da.Fill(dtold)
                sollte also vom Compiler bemängelt werden außer du hast nochmal woanders ein dtold definiert und das nicht befüllt.

                Comment


                • #9
                  Ups, das hate ich doch glatt übersehen, jetzt stehts vor der Schleife, wo es hingehört, allerdings wird trotzdem nur das Select-Ergebnis des letzten Wertes des ListView angezeigt. es muss also noch irgendwo anders ein Fehler drin sein

                  Comment


                  • #10
                    Dim dtold As New DataTable()
                    Dim dtnew As DataTable = dtold.Copy
                    dtold.Merge(dtnew, True)
                    Du erzeugst in der Schleife jedes mal 2 Datatables neu und merged die solange die leer sind(wen die neu erzeugt sind können die ja nur leer sein) um dann nachher irgendwann das SQL auszuführen. Kommt dir das nicht irgendwie verdreht vor?

                    1. Ein Dataset erzeugen.
                    2. In einer Schleife über deine Items iterieren
                    3. zweites Dataset erstellen und mit Fill füllen.
                    4. dieses 2.te Dataset in das erste vor der Schleife erzeugte Dataset mergen.
                    5. nach dem Durchlauf der Schleife das 1.te Dataset ans Grid binden.

                    Edit:
                    Sehe gerade du benutzt einen Dataadapter und keinen Tableadapter. Wenn ich mich richtig erinnere löscht die Fill Methode eines Dataadapter beim Fill Daten die schon in der Datatable vorhanden sind eh nicht. Du müsstest nur dafür sorgen das deine Datatable in der Schleife nicht immer neu erzeugt wird sondern in jedem Schleifendurchlauf immer die gleiche Datatable Instanz verwendet wird. Dann solltest du auch ohne Aufruf von Merge und einer 2.ten Datatable auskommen können
                    Zuletzt editiert von Ralf Jansen; 08.10.2010, 10:14. Reason: Unsinnige Textartefakte entfernt.

                    Comment


                    • #11
                      Hallo Ralf,

                      leider hat da jemand den Rest von deinem Text abgebissen, stand da noch was wichtiges?
                      Deine Erinnerung stimmte, ein Merge wird garnicht benötigt! Nach einigem Herumbrobieren hab ich das Problem jetzt gelöst:
                      [highlight=vbnet]
                      Dim dt As New DataTable()

                      For i = 0 To lstCustNo.Items.Count - 1

                      tbTemp.Text = "select * from customers where ZIP like '" & lstCustNo.Items(i) & "'"

                      Try
                      Application.DoEvents()
                      da = New SqlDataAdapter(tbTemp.Text.Trim(), conn)
                      da.SelectCommand.CommandTimeout = 120
                      da.Fill(dt)

                      Catch ex As Exception
                      MessageBox.Show(ex.Message)
                      End Try

                      Next i

                      frmGrid.grid1.DataSource = dt
                      frmGrid.MdiParent = frmMenu
                      frmGrid.Show()

                      [/highlight]

                      Ich musste einfach nur da.Fill(dt) mit in die Schleife schieben und schon funktionierts! Dein Hinweis mit dem DataAdapter war also goldrichtig! Ich danke dir für deine geduldige Hilfe!!

                      Comment

                      Working...
                      X