none
Update einer Tabelle mit Hilfe eines SqlDataAdapter RRS feed

  • Frage

  • Guten Morgen,

    ich habe seit einiger Zeit ein Problem, welches ich nicht so recht lösen kann.

    Ich habe ein Abbild(nur die Struktur) einer bestehenden Tabelle in einer Datenbank erstellt. Diese würde ich nun gerne mit den Daten der bestehenden Tabelle füllen. 

    Ich fülle ein DataSet, mit Hilfe eines SqlDataAdapter, mit den Daten der bestehenden Tabelle. Nun möchte ich mit dem Update-Befehl die Daten in die neue Tabelle übertragen, leider funktioniert dies nicht. Eine Fehlermeldung kommt nicht.

    Mein Code:

                SqlDataAdapter adapStamm = new SqlDataAdapter("SELECT * FROM stammArtikel", conn);
                DataSet dsStamm = new DataSet();
                adapStamm.Fill(dsStamm);
                dsStamm.Tables[0].TableName = "tempFullTable";
    
                SqlDataAdapter adapTemp = new SqlDataAdapter("SELECT * FROM tempFullTable", conn);
                DataSet dsTemp = new DataSet();
                adapTemp.Fill(dsTemp);
                dsTemp = dsStamm;
                SqlCommandBuilder commmandBuilder = new SqlCommandBuilder(adapStamm);
                adapTemp.UpdateCommand = commmandBuilder.GetUpdateCommand();
                adapTemp.Update(dsTemp);

    Hat jemand dafür einen Lösungsvorschlag?

    Danke :)

    Mittwoch, 20. Juni 2012 08:42

Antworten

  • Hallo,

    da passt so gut wie gar nichts.

    Wenn Du die Daten in eine DataTable einliest, so sind die Daten in der Voreinstellung unverändert,
    siehe AcceptChangesDuringFill Eigenschaft. Setze sie auf false, dann gelten die Daten als "neu".

    Das Zuweisen einer Referenzvariablen dsTemp = dsStamm; ist sinnfrei.
    Du kannst die erzeugte DataTable auch einem anderen DataAdapter zuweisen.

    Da man die Daten einfügen will, wäre hier das InsertCommand notwendig,
    das UpdateCommand dient zum Aktualisieren bestehender Daten (in tempFullTable) -
    was aber auf dem Wege überhaupt nicht möglich wäre.
    (Dazu  müsstest Du alle Zeilen selbst abgleichen, was den Rahmen dieser Antwort sprengt)

    Am Ende ist das Ganze via DataSet und Adapter ohnehin der umständlichste Weg,
    da die Daten erst über den Speicher des Client (so er denn überhaupt ausreicht) müssen.

    Einfacher ist es den SQL Server seine Arbeit machen zu lassen, dafür wurde er gemacht:

            public static void CopyTable()
            {
                using (var connection = new SqlConnection(DefaultConnectionString))
                {
                    using (var command = new SqlCommand(
                         "INSERT INTO tempFullTable SELECT * FROM stammArtikel;", connection))
                    {
                        connection.Open();
                        command.ExecuteNonQuery();
                    }
                }
            }
    

    Alternativ könntest Du SELECT * INTO tempFullTable FROM stammArtikel; verwenden,
    vorausgesetzt die Tabelle tempFullTable existiert noch nicht, siehe INTO-Klausel

    Gruß Elmar

    • Als Antwort markiert StevS Freitag, 22. Juni 2012 06:01
    Mittwoch, 20. Juni 2012 09:43
    Beantworter