Announcement

Collapse
No announcement yet.

beliebige Datatable per Dataadapter in DB schreiben

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

  • beliebige Datatable per Dataadapter in DB schreiben

    Guten Morgen.

    Ich lese nun schon seit Tagen die verschiedensten Beiträge und Tutorials über den Dataadapter. Leider habe ich dabei noch ein Verständnisproblem.

    Ist es möglich, eine von "Hand" erstellte Datatable einem Dataadapter unterzujubeln und ihm zu sagen speichere den Inhalt in einer existierenden Zieltabelle der Datenbank?

    Alles was ich bisher finden konnte, bezieht sich auf das Hinzufügen bzw. Updaten geänderter Inhalte einer Datatable, welche die Verbindung zur Zieltabelle vorher mit Hilfe der Fill-Methode herstellt.

    Bin ich gezwungen eine Datatable mit Hilfe der Fill-Methode zu erstellen (indem ich irgendetwas abfrage) und diese dann zu leeren und mit den eigentlichen Daten zu füllen?

    Kann hier Jemand etwas Licht ins Dunkel bringen?

    MfG Brorecas

  • #2
    Meines Wissens ist das überhaupt kein Problem eine generierte Datentabelle in eine Datenbank zu schreiben. Voraussetzung ist allerdings, dass die Tabelle in der Datenbank bereits erstellt wurde und dass die Datenstruktur passt!

    Comment


    • #3
      Vielen Dank für Deine Antwort!

      Natürlich muß die Tabelle in der DB vorhanden sein und strukturell passen.

      Die Frage ist nur, wie bekomm ich über den DataAdapter die Datatable mit der DB Table verknüpft?

      Wie ich oben schon schrieb, finde ich nur Erklärungen bei denen die Verknüpfung über ein Fill hergestellt wird. Geht das echt nicht anders? Muß man wirklich die DB erst mit einer "sinnlos" Abfrage ansprechen?

      An dieser Stelle liegt mein Problem, ich weis nicht wie ich das umsetzen kann!

      MfG Brorecas

      Comment


      • #4
        Am einfachsten ist es, sich den Command für ein Insert, Update oder sonstiges über einen Commandbuilder zusammenbauen zu lassen. Um ein Fill kommst du allerdings, soweit ich weiß, nicht herum, da der DataAdapter bzw. der CommandBuilder die Struktur deiner Tabelle kennen muss.

        Vielleicht hilft dir dieser kleinen Code-Schnipsel schon weiter (nur mal so'n kleines Beispiel):
        Code:
        Dim da As New System.Data.OleDb.OleDbDataAdapter("select * from <Tabellenname>")
        Dim cb As New System.Data.OleDb.OleDbCommandBuilder(da)
        Dim dt As New DataTable
        
        da.Fill(dt)
        .....
        da.InsertCommand = cb.GetInsertCommand
        da.Update(dt)
        Nach dem Fill musst du dann nur noch das dt so füllen, wie du es irgendwo sowieso schon tust, das Update schreibt dann alles in die Datenbank.

        Comment


        • #5
          Vielen Dank für die Antwort.

          Schade das man um das Fill nicht herumkommen kann. Das lässt mich an der Stelle echt überlegen ob ich da dann nicht doch Zeile für Zeile wegschreibe.

          Na mal sehen, ich werd mal mit ner größeren Datenmenge testen wie es sich so arbeiten lässt und wie die Performance ist.


          MfG Brorecas

          Comment


          • #6
            Ich denke, dass der DataAdapter in Verbindung mit dem CommandBuilder ne ganz schöne Sache ist, wie ich finde aber eher für Standardsachen geeignet. Daher mache ich es auch immer so, dass ich ich mir den (Db)Command selber zusammenbaue und das ganze dann mit nem ExecuteNonQuery in die Datenbank schreibe und somit garkeinen DataAdapter verwende.

            Comment


            • #7
              Ja leider!

              Es wäre halt nur gerade bei großen Datenmengen sehr schön gewesen die Datatable so in einem Rutsch schreiben zu können.

              Gerade wenn man keine Transactions benutzen kann, muss man eine Fehlerbehandlungsroutine aufbauen die evtl. schon eingefügte Datensätze wieder löscht. Und diese muss sich auch noch alles merken können, falls die DB mal nicht mehr erreichbar ist und man nachträglich löschen muss.

              Das macht alles wieder unnötig kompliziert.

              Naja für das holen von Daten werd ich den Adapter weiterhin benutzen, man hat dann zwar ne "Mischform" aber muss sich keine sorgen um das Befüllen der DataTables aus der DB machen.

              Danke für Deine Antworten!

              MfG Brorecas

              Comment


              • #8
                Ich vermute mal, dass du Probleme mit dem DataAdapter.Fill hast, weil deine Tabelle in der Datenablage etwas größer ist und du nicht alle Daten jedesmal laden willst. Dann könntest du eine unmögliche WHERE-Klausel eingeben ( z.B. ID <0 ), sodass nur die Datenstruktur geladen wird. Mit dieser geladenen leeren Tabelle kannst du dann weiterarbeiten, wobei du dir die Tabellenerstellungsroutine sparen könntest, bzw. du kannst sie auch wegschmeissen. Abgespeichert wird dann jedoch deine generierte, bzw. geänderte Originaltabelle mit dem CommandBuilder über den DataAdapter.Update Befehl.
                Wenn du ohne CommandBuilder speichern möchtest, müsstest du dir die AktionsCommands für den DataAdapter selber schreiben, was jedoch schnell in Arbeit ausarten kann!
                Zuletzt editiert von Kyrrho; 16.11.2010, 14:16.

                Comment


                • #9
                  Originally posted by Kyrrho View Post
                  Ich vermute mal, dass du Probleme mit dem DataAdapter.Fill hast, weil deine Tabelle in der Datenablage etwas größer ist und du nicht alle Daten jedesmal laden willst. Dann könntest du eine unmögliche WHERE-Klausel eingeben ( z.B. ID <0 ), sodass nur die Datenstruktur geladen wird. Mit dieser geladenen leeren Tabelle kannst du dann weiterarbeiten, wobei du dir die Tabellenerstellungsroutine sparen könntest, bzw. du kannst sie auch wegschmeissen. Abgespeichert wird dann jedoch deine generierte, bzw. geänderte Originaltabelle mit dem CommandBuilder über den DataAdapter.Update Befehl.
                  Wenn du ohne CommandBuilder speichern möchtest, müsstest du dir die AktionsCommands für den DataAdapter selber schreiben, was jedoch schnell in Arbeit ausarten kann!
                  Entschuldige die späte Antwort, aber ich hatte hier irgendwie keine weiteren Posts erwartet.

                  Ich möchte keine neue Tabelle in der DB generieren, ich wollte in eine bestehende Tabelle schreiben. Also "nur" eine Anfügeabfrage durchführen.

                  Eine "sinnlose" Where-Klausel zu verwenden um die Connection zur Tabelle herzustellen ist eine Möglichkeit, aber die habe ich ersteinmal verworfen.
                  Da ich nicht allein an dem Projekt arbeite und man noch nicht abschätzen kann wohin es sich entwickelt.
                  Das bedeutet, eine aktuell sinnlose Klausel könnte später sinnig werden weil irgendwer nicht aufpasst. Und dann hätt ich später wieder Theater damit.
                  Ich hoffe Du kannst diesen Gedanken nachvollziehen.

                  Deshalb suchte ich eine Möglichkeit dem Datadapter zu sagen in welche DB-Tabelle er das schreiben soll, ohne vorher mit .Fill gearbeitet zu haben.

                  MfG Brorecas

                  Comment


                  • #10
                    Das bedeutet, eine aktuell sinnlose Klausel könnte später sinnig werden weil irgendwer nicht aufpasst. Und dann hätt ich später wieder Theater damit.
                    [Highlight=SQL]Select Spalte from Tabelle where 1=0 [/Highlight]

                    Gib ein Beispiel wo das in Zukunft sinnig werden kann.

                    Deshalb suchte ich eine Möglichkeit dem Datadapter zu sagen in welche DB-Tabelle er das schreiben soll, ohne vorher mit .Fill gearbeitet zu haben.
                    Einfach das InsertCommand(und/oder UpdateCommand) an deinem DataAdapter passend selbst schreiben.

                    Comment


                    • #11
                      Originally posted by Ralf Jansen View Post
                      [Highlight=SQL]Select Spalte from Tabelle where 1=0 [/Highlight]

                      Gib ein Beispiel wo das in Zukunft sinnig werden kann.
                      Öhhhhhhhhm.....OK an sowas hab ich überhaupt nicht gedacht!

                      Vielen Dank!

                      Dann werd ich das doch nochmal versuchen.

                      MfG Brorecas

                      Comment

                      Working...
                      X