Benutzer mit den meisten Antworten
Dataset aktualisieren schlägt fehl

Frage
-
Guten Tag,
bisher nutzte ich Jet/ADO zum Schreiben von Daten in die Datenbank.
Nun möchte ich die neuen Funktionen des DataSet nutzen, habe aber ein generelles Problem:
Die Funktion läuft fehlerfrei ab, aber es werden aber keine Daten in die Datenbank geschrieben. Was mache ich falsch oder was fehlt hier:
public bool schreibeInDB() { conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\temp\Database1.accdb"; OleDbConnection con = null; int lfd = 0, err = 0; try { string sqlStr = string.Format("Select * from Tabelle"); DataSet myDataSet = new DataSet(); con = new OleDbConnection(conStr); con.Open(); OleDbCommand oleCmd = new OleDbCommand(sqlStr, con); OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(oleCmd); myDataAdapter.Fill(myDataSet, "tview"); DataTable tab = myDataSet.Tables[0]; for (int i=0; i< 3; i++ ) { DataRow row = tab.NewRow(); row["ID"] = "0815" + lfd++; row["Text1"] = "0815"; tab.Rows.Add(row); if (tab.HasErrors) tab.RejectChanges(); else tab.AcceptChanges(); } OleDbCommandBuilder builder = new OleDbCommandBuilder(myDataAdapter); myDataAdapter.UpdateCommand = builder.GetUpdateCommand(); myDataAdapter.Update(myDataSet, tab.TableName); } catch (Exception e) { Console.WriteLine("Genereller Fehler beim Import", e); return false; } finally { try { if (con != null && con.State == ConnectionState.Open) con.Close(); } catch (Exception) { } } Console.WriteLine("Import von {0} Sätzen mit {1} Fehlern abgeschlossen", lfd, err); return true; }
Im Unit-Test läuft die Funktion fehlerfrei durch, es wird 3x die Funktion
tab.AcceptChanges();
aufgerufen, die Meldung
Import von 3 Sätzen mit 0 Fehlern abgeschlossen
wird nach auch mehreren Versuchen angezeigt. Die Tabelle in der Datenbank bleibt vollkommen unberührt. Könnte mir hier jemand weiter helfen?
Vielen Dank...
Jens Hirsch
Antworten
-
Hi,
wenn der CommandBuilder zum DataAdapter zugeordnet wurde und kein InsertCommand zugewiesen wurde, dann stellt das der CommandBuilder bereit. Das ist im Code von Jens richtig implementiert. Ursache des Problems von Jens ist lediglich das bereits genannte überflüssige Ausführen von AcceptChanges. Mit AcceptChanges werden alle Datensätze auf Unchanged gesetzt (auch Datensätze mit RowState "Added"). Damit hat der DataAdapter nichts zu aktualisieren. AcceptChanged wird in den Standardeinstellungen automatisch vom DataAdapter nach erfolgreicher Aktualisierung der Datenbank ausgeführt.--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Jens Hirsch Freitag, 16. Juni 2017 08:20
Alle Antworten
-
Hallo Jens,
Wenn Du AcceptChanges weglässt, sollte es gehen. AcceptChanges bewirkt, dass die bearbeiteten Zeilen als ungeändert gelten, sodass keine Änderungen beim Update übernommen werden, wenn diese Methode vor der Update-Methode des Datenadapters aufgerufen wird. Für weitere Informationen sieh Dir diese Threads an:
SqlDataAdapter speichert die Daten in der Datenbank nicht
Probleme mit DataRow, editierte Werte werden nicht in Tabellen übernommenGruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo,
ergänzend zu bereits gegebenen Antworten, überprüfe deinen Code auch mal im Hinblick auf die Stichworte DataAdapter: "InsertCommand", "UpdateCommand", "DeleteComand", "RowState" und was "AcceptChanges" bewirkt.
Wenn ich es recht erinnere, wird bei neuen Datensätzen das "InsertCommand" bemüht...
Siehe auch hier:Aktualisieren von Datenquellen mit DataAdapters
Zitat: "Wenn die Update-Methode aufgerufen wird, analysiert der DataAdapter die vorgenommenen Änderungen und führt dann den entsprechenden Befehl (INSERT, UPDATE oder DELETE) aus. Wenn der DataAdapter eine Änderung an einer DataRow feststellt, verwendet er zum Verarbeiten der Änderung den InsertCommand, den UpdateCommand oder den DeleteCommand."
Gruß
- Bearbeitet K. Pater Donnerstag, 15. Juni 2017 12:03
-
Hi,
wenn der CommandBuilder zum DataAdapter zugeordnet wurde und kein InsertCommand zugewiesen wurde, dann stellt das der CommandBuilder bereit. Das ist im Code von Jens richtig implementiert. Ursache des Problems von Jens ist lediglich das bereits genannte überflüssige Ausführen von AcceptChanges. Mit AcceptChanges werden alle Datensätze auf Unchanged gesetzt (auch Datensätze mit RowState "Added"). Damit hat der DataAdapter nichts zu aktualisieren. AcceptChanged wird in den Standardeinstellungen automatisch vom DataAdapter nach erfolgreicher Aktualisierung der Datenbank ausgeführt.--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Jens Hirsch Freitag, 16. Juni 2017 08:20
-
Hallo,
vielen Dank für die schnelle Hilfe- es funktioniert. Ursache war tatsächlich die Zeile
tab.AcceptChanges();
- ehrlich gesagt, wäre ich ohne Hilfe nie darauf gekommen...
Zur Vollständigkeit: Dann war im Code noch
myDataAdapter.SelectCommand.CommandText="Select ID, text1 from Tabelle" ;
einzufügen, da die automatisch generierte SQL-Anweisung alle Felder der Tabelle umfasst und damit Probleme mit fehlenden Parametern hat.
Noch mal vielen Dank
:-) Jens