DataSet Update



  • Hallo,

    ich habe mal eine grundsätzliche Frage zum Ablauf, wie man ein UPDATE mit einem DataSet umsetzt.

    Zunächst hole ich mit einem select alles gewünschte aus der Datenbank und übergebe diese Daten an ein DataSet.
    Dieses knüpfe ich mittels DataBinding an meine jeweiligen Controls.

    Nun meine Frage für das update.
    Muss ich dazu eine neue update Anweisung schreiben, oder kann ich auf das bestehende Dataset einfach ds.Update machen und alles ist gut?!
    Oder wie hat so ein Ablauf auszusehen?

    Ich danke Euch für Eure Hilfe!





  • Danke für die Links.
    Hab das jetzt mal versucht .. leider bleibt bei mir der DataAdapter leer?!

    Hier das SELECT

    ...
    MySqlCommand command = new MySqlCommand(query);
    
                DataSet ds = new DataSet();
                using (MySqlDataAdapter da = new MySqlDataAdapter(query, connection))
                {
                    da.Fill(ds, "tabelle");   // da ist hier schon überall null
                    Program.dataAdapter = da; // adapter verfügbar für and Methode
                    return ds;
                }
    

    Hier das UPDATE

    ...
    StringBuilder stringBuilder = new StringBuilder();
    MySqlCommand command = new MySqlCommand("UPDATE property SET property_name = ?name WHERE id = " + nummer + "",da.SelectCommand.Connection);
    
                command.Parameters.Add("?name", MySqlDbType.String);
                command.Parameters["?name"].SourceVersion = DataRowVersion.Current;
                command.Parameters["?name"].SourceColumn = "propertyName";
                da.UpdateCommand = command;
                DataSet ds = new DataSet();
                da.Fill(ds, "property");
                ds.Tables["property"].Rows[0]["propertyName"] = "Access";
                da.Update(ds, "property");
    

    Das Update wird natürlich nicht ausgeführt, da das da.SelectCommand.Connection null ist.

    Wie kann ich also in der SELECT Methode dem da Werte zuweisen?!



  • Hallo

    Hast du mal einen Profiler mitlaufen lassen, ob er das Kommando auch richtig absetzt?

    Hier wäre mal ein anderen testcode zum füllen, der ging bei mir:

    using (SqlDataAdapter a = new SqlDataAdapter("SELECT * FROM MeinTabellenName", c)){
      DataTable t = new DataTable();
      a.Fill(t);
    }
    

    Zumindest zum testen ob ers richtig macht.

    Mfg marco



  • Hallo Marco,

    inzwischen funktioniert es.

    Nun hab ich aber folgendes Problem, ich möchte nicht nur eine Spalte updaten, sondern mehrere. Da komme ich nun nicht mehr zurecht, was ich wo eintragen sollte.

    using (MySqlDataAdapter da = new MySqlDataAdapter(querySelect, Program.sqlPeconConString))
                {
                    // Update statement.
                    StringBuilder sbUpdate = new StringBuilder();
                    sbUpdate.Append("UPDATE tbldata a ");
                    sbUpdate.Append("LEFT JOIN tbldocumentation b ");
                    sbUpdate.Append("ON a.pNo = b.pNo ");
                    sbUpdate.Append("SET a.type = ?type");
                    sbUpdate.Append("b.description = ?description ");
                    sbUpdate.Append("WHERE a.ID = " + ID + "");
                    String queryUpdate = sbUpdate.ToString();
    
                    MySqlCommand commandUpdate = new MySqlCommand(queryUpdate, con);
                    commandUpdate.Parameters.Add("?type", MySqlDbType.String);
                    commandUpdate.Parameters["?type"].SourceVersion = DataRowVersion.Current;
                    commandUpdate.Parameters["?type"].SourceColumn = "type";
    
                    commandUpdate.Parameters.Add("?description", MySqlDbType.String);
                    commandUpdate.Parameters["?description"].SourceVersion = DataRowVersion.Current;
                    commandUpdate.Parameters["?description"].SourceColumn = "description";
    
                    DataSet ds = new DataSet();
    
                    if (check == 1)
                    {
                        da.Fill(ds, "tbl");
                        return ds;
                    }
                    if (check == 2)
                    {
                        da.UpdateCommand = commandUpdate;
                        da.Fill(ds, "tbldata");
                        ds.Tables["tbldata"].Rows[0]["type"] = "testtype";     
                        da.Update(ds, "tbldata");
                        return null;
                    }
                }
                return null;
    

    Wie sollte der untere Teil im UpdateCommand aussehen, wenn ich einen weiteren Spaltenwert ändern möchte?
    Ein weiteres ds.Tables einfügen?
    Und auf welche Tabelle beziehe ich mich dann im ds.Update?

    Danke!



  • Ich habe nun versucht eine DataRelation zwischen den Tabellen zu erstellen

    da.TableMappings.Add("Table", "tbldata");
                        da.TableMappings.Add("Table1", "tbldocumentation");
    
                        da.UpdateCommand = commandUpdate;
                        da.Fill(ds);
    
                        DataColumn colMaster = ds.Tables["tbldata"].Columns["typeID"];
                        DataColumn colDetail = ds.Tables["tbldocumentation"].Columns["typeID"];
                        DataRelation rel = new DataRelation("tbldata",
                                                            colMaster, colDetail);
    
                        ds.Tables["tbldata"].Rows[0]["name"] = "testname";   
                        ds.Tables["tbldocumentation"].Rows[0]["description"] = "Testbeschreibung";
                        ds.Relations.Add(rel);
                        da.Update(ds);
                        return null;
    

    Dennoch erhalte ich bei der Zeile

    ds.Tables["tbldocumentation"].Rows[0]["description"] = "Testbeschreibung";
    

    die Fehlermeldung
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    😕 😕



  • Hallo

    Nach mehrmaligen lesen bin ich nun endlich dahinter gestiegen was du möchtest, ist wohl eigentlich doch zu spät, aber naja ich probiere es doch mal.

    Also wenn ich dich richtig verstanden habe, dann willst du mehrere _Spalten_ _einer_ Tabelle verändern? Wenn dem so ist, dann ist schon mal dein Sql-Kommando falsch, und zwar um ein Update im SQL durchzuführen schreibt man folgendes:

    UPDATE a
    SET spalte1 = Wert1
      , spalte2 = Wert2
    FROM tbldata a
    LEFT JOIN tbldocumentation b ON a.pNo = b.pNo
    WHERE a.ID = ID
    

    Solltest du doch jeweils eine Spalte in mehreren Tabellen verändern wollen, dann funktioniert dies nicht über ein Kommando, da jedes Sql-Commando nur eine Tabelle verändern kann. Was gehen könnte, aber nicht bestätigen kann, ist dass du mehrere Update-Befehle hintereinander in das Commando-Objekte hängst alla:

    UPDATE a SET spaltea = Wert1
    FROM tbldataa WHERE a.ID = ID;
    UPDATE b SET spalteb = Wert2
    FROM tbldocumentation b WHERE pNo = NO
    

    Aber mal rein deine Fehlermeldung beachtet, bist du dir sicher, dass die einzelnen Schritte in deiner Zeile Quellcode auch jeweils etwas zurückliefern, also Tabelle Vorhanden, eine Zeile Vorhanden, und darin die Spalte Dokumentation vorhanden?

    Mfg Marco

    PS: andere Frage, wieso benutzt die nicht zB das EntityFramework für sowas? Meiner Meinung nach, gibt es fast nichts besseres aktuelle für C# um eine Verbindung mit einer DB aufzubauen wenn du keine Prozeduren zum abfragen benutzt.
    Bzw mal gedanken gemacht, die Daten nicht direkt abzudaten sondern per Bestätigungsbutton alle Änderungen innerhalb einer Schleife auf einmal in die DB zu übertragen.



  • Bei mir würde Dein zweiter Fall in Betracht kommen - also jeweils eine Spalte in mehrere Tabellen.

    Aber danke mal für den Hinweis mit dem Entity Framework.
    Kann bisher damit noch gar nix anfangen - eigenständiges Programm? Oder innerhalb von C#?
    Ich werde mal googeln ... vielleicht finde ich was.



  • Zusätzliche Komponente vom Visual Studio würde ich sagen, beim Googlen solltest aber genug finden.

    MfG Marco



  • Als Auswahlmöglichkeit erhalte ich u. a. "Dienstbasierte Datenbank".
    Diese kann ich allerdings nicht auswählen, da ich den SQL Server nicht intalliert habe.

    In den Anleitungen wird geschrieben, dass "Generate from database" ausgewählt werden soll. Ich nehme mal an, dass oben genannte dienstbasierte DB gemeint ist?!

    Dazu meine Fragen: Soll der SQL Server intalliert werden?

    Geht das mit der Express Edition überhaupt?



  • Zuerst mal, ja es sollte mit der Express Edition funktioniert.

    Und zum einrichten, Rechtsklick auf dien Projekt, dann "Hinzufügen...->Neues Element" dort wählst du dann das Elemente "ADO.NET Entity Data Model" aus, gibst ihn einen neuen Namen und bestätigst das ganze per Okay.
    In dem neuen Tab der dann automatisch erscheint, kann du dann deine Datenbank per Hand modellieren oder du kannst per Rechtsklick und Auswahl des Menüpunktes "Model aus der Datenbank aktualliseren" das Model aus der Datenbank erstellen lassen.

    Und nein du benötigst keinen bei dir installierten SQL-Server, wenn du mit einen SQL-Server auf einem anderen Rechner arbeitest. Den installierten Sql-Server benötigst du nur wenn du entweder lokal mit einem Sql-Server sprechen möchtest, oder diese mdf-Dateien direkt in dein Projekt mit einbinden willst (was ich nicht wirklich empfehle)

    MfG Marco



  • Sonnenlichtfee schrieb:

    ...

    Ein bisschen eigene Recherche kann man vielleicht schon erwarten, zudem kann ich deine Fragen teilweise nicht verstehen oder ernst nehmen...

    Sonnenlichtfee schrieb:

    Dazu meine Fragen: Soll der SQL Server intalliert werden?

    Gegenfrage: Willst du eine Datenbank verwenden oder nicht? Und wenn welche? Wenn du eine SQL Server Datenbank verwenden willst MUSST du SQL Server installieren. Es gibt noch die kleine Variante (SQL Server Compact) die einiges vom SQL Server nicht kann, für einfache Fälle und als lokale Datenbank durchaus brauchbar ist.

    Sonnenlichtfee schrieb:

    Geht das mit der Express Edition überhaupt?

    Der SQL Server Express ist frei verfügbar. Nach Möglichkeit würde ich die Management Tools (bzw. eine entsprechende Express-Version mit diesen) aber mit installieren.

    Ich arbeite garnicht mit DataSet, hierzu liefere ich auch gerne einen Zitat:

    Entity Framework is Microsoft's recommended data access technology for new applications.

    Sofern man das Entity Framework verwenden will, kann eine aktuelle Fassung über NuGet bezogen werden.

    Ich weiß nicht ob dies im VS Express der gleiche Ablauf ist, bzw. ob dies überhaupt mit Express funktioniert: über "Tools/Extension Manager" den NuGet Package Manager besorgen, und anschließend habe ich beim Rechtsklick auf einen Projekt die Option "Manage NuGet Packages", dort kann man "EntityFramework" suchen und hinzufügen.


Anmelden zum Antworten