Probleme mit AcceptChanges() bzw. beim zurückschreiben auf den MSSQL-Server

28/10/2009 - 18:25 von Friedrich Kölbel | Report spam
Hallo Spezialisten,

Leider komm ich mit ADO.net nicht so recht zum fahren...
Ich weiß es gibt verschiedenste Möglichkeiten mit DataSets zu
arbeiten, ich hab mal folgendes versucht:

this.conn = new SqlConnection('myconnectionstring');
string sql = @"select * from time_import";
try
{
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(sql, conn);

DataSet ds = new DataSet();
da.Fill(ds, "time_import");

DataTable dt = ds.Tables["time_import"];

DataRow newRow = dt.NewRow();
newRow["start_real"] = start_real;
newRow["end_real"] = end_real;
newRow["user_id"] = user_id;
//.. weitere Felder...

ds.AcceptChanges();

OK, hab ich so in einem Beispiel gefunden und funktionert auch
"fehlerfrei", aber am Ende steht nichts neues in der Datenbank.
Nun hab ich einge Hinweise gefunden, dass es noch ein "Update"
benötigt, damit der Content nicht nur in den Speicher, sondern auch in
die Datenbank zurück geschrieben wird.
Also hab ich es so versucht:

da.Update(dt);
ds.AcceptChanges();

àndert aber nichts... kein Fehler, aber in der Datenbank kommt nichts
an.
Ich hab nun so ziemlich alle Kombinationen von da, dt ds - update und
AcceptChanges durchprobiert - leider geht nichts davon.

Ich hab das ganze in der Zwischenzeit über den ganz anderen Zugang mit
einem reinen SQL-Command zum Laufen gebracht, aber ich würde
eigentlich lieber mit dem DataSet arbeiten - hat hier jemand einen
Tipp, was ich da falsch mache?
Danke im Voraus für Eure Antworten!

P.S. Hier noch zur Vollstàndigkeit die derzeit funktionierende Methode
mit dem SQL-Command

conn.Open();
string sqlIns = "INSERT INTO time_import (start_real,end_real, ...) "
+ "VALUES (@start_real, @end_real, ...)";

SqlCommand cmdIns = new SqlCommand(sqlIns, conn);

SqlParameter param = new SqlParameter();
param.ParameterName = "@start_real";
param.Value = start_real;
cmdIns.Parameters.Add(param);

SqlParameter param = new SqlParameter();
param.ParameterName = "@end_real";
param.Value = end_real;
cmdIns.Parameters.Add(param);

cmdIns.ExecuteNonQuery();
cmdIns.Dispose();
cmdIns = null;
 

Lesen sie die antworten

#1 Frank Dzaebel
29/10/2009 - 07:44 | Warnen spam
Hallo Friedrich,

OK, hab ich so in einem Beispiel gefunden und funktionert auch
"fehlerfrei", aber am Ende steht nichts neues in der Datenbank.



Es gàbe einiges zu sagen, aber ich nehme mal nur das wichtigste.
Die Update-Methode führt selbst am Ende AcceptChanges aus.
Wenn Du nach Änderungen selber die AcceptChanges-Methode
aufrufst, wàren alle Deine Änderungen nicht mehr in der
Modified-Collection und somit für das Update-Kommando quasi
unsichtbar. Dazu fehlt bei Dir der SqlCommandBuilder,
weswegen der 'da' kein UpdateCommand hat und den
Update-Befehl schlicht nicht ausführt.

Hier eine bessere Formulierung Deines Quellcodes:

SqlConnection conn;
Properties.Settings Props = Properties.Settings.Default;

private void btnUpdate_Click(object sender, EventArgs e)
{
// - Die Datenbank und die Tabelle müsste in der DB existieren
// - Es müsste eine Spalte als Primàrschlüssel-Spalte festgelegt sein

try
{
conn = new SqlConnection(Props.VerbindungsZeichenfolge);
string sql = @"select * from time_import";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(sql, conn);
SqlCommandBuilder builder = new SqlCommandBuilder(da); // Zugefügt!
conn.Open();

DataSet ds = new DataSet();
da.Fill(ds, "time_import");
DataTable dt = ds.Tables["time_import"];
DataRow newRow = dt.NewRow();
// newRow["id"] = 1; // Primàrschlüssel
newRow["start_real"] = DateTime.Now;
newRow["end_real"] = DateTime.Now;
newRow["user_id"] = 42;
//.. weitere Felder...
dt.Rows.Add(newRow);
da.Update(ds, dt.TableName);
//string updateKommando = builder.GetUpdateCommand().CommandText;
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
finally
{
if (conn != null) conn.Close();
}
}
______________

[DbDataAdapter.Update-Methode (DataTable) (System.Data.Common)]
http://msdn.microsoft.com/de-de/lib...2bkx2.aspx

[SqlCommandBuilder-Klasse (System.Data.SqlClient)]
http://msdn.microsoft.com/de-de/lib...ilder.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen