C# Db tabelle wird nicht aktualisiet

aw48

Ensign
Registriert
Dez. 2013
Beiträge
140
hallo, guten abend

tableadapter.update() aktualisiert die DB tabelle nicht !

Verwendet : Visual C# 2008, SQL Express 2005

Programmcode :

DataTable dt;
ProjectDS dsPro;
ProjectDSTableAdapters.tblCfgTableAdapter taCfg;

dt = dsPro.Tables["tblCfg"];

dt.BeginLoadData();
dt.LoadDataRow(ao,false); (ao : object[])
dt.EndLoadData();
taCfg.Update(dsPro.tblCfg);

alle anweisungen werden ohne fehler ausgeführt

dt enthält die geschriebenen daten (debug)

die tabelle im datenbank-explorer zeigt diese daten NICHT.

fehlt da noch 'was ?

bitte keine links angeben, hab schon zwei tage alles durchsucht aber nichts

passendes dazu gefunden.

danke im vorraus
 
Auf die Gefahr hin das ich blind bin, aber wo schreibst du denn dein DataTable in die Datenbank? Nur weil da Werte drin stehen, passiert da ja nicht automatisch etwas.
 
aus all dem was ich bisher zu diesem thema gelesen hab schliess ich folgendes :
det tableadapter (taCfg) stellt die verbindung zwichen db-tabelle und dataset her.
dt.LoadDataRow(..) lädt die daten in die tabelle, die ja nicht s anderes ist als die
tabelle des datasets.
 
Nö. Damit lädst du die Daten in dein DataTable, nicht in die Datenbank... (nicht verwechseln: DataTable ist ein Bestandteil deines Programms das Daten enthalten kann, die Datenbanktabelle ist Bestandteil der Datenbank, auf welche du mit deinem Programm zugreifen kannst)

Code:
public DataTable GetData()
{
    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["BarManConnectionString"].ConnectionString);
    conn.Open();
    string query = "SELECT * FROM [EventOne]";
    SqlCommand cmd = new SqlCommand(query, conn);

    DataTable dt = new DataTable();
    dt.Load(cmd.ExecuteReader());
    return dt;
}

Quelle: http://stackoverflow.com/questions/11993211/how-to-fill-datatable-with-sql-table


http://codekicker.de/fragen/speichern-DataTable-SQL-Datenbank <- So schreibst du dein DataTable in eine Datenbank. Also wenn du 2 Tage gesucht haben solltest, dann solltest du dich etwas intensiver mit Google beschäftigen... ;)
 
Zuletzt bearbeitet:
zunächst mal danke für deinen beitrag.
was du beschreibst ist das lesen den daten aus der datenbank und geht am tableadapter.update() vorbei.
ich verwende überhaupt keine sql-statements da der tableadapter das für mich macht ( select, insert,update und delete werden
automatisch an hand der tabellenstruktur generiert)
dass die daten über tableadapter.update in die tabelle geschrieben werden kann nicht sein, denn NACH dt.LoadDataRow() und VOR
tableadapter.update() stehen die daten ja schon in der tabelle drin (sehe ich jedenfalls beim debuggen)
Ergänzung ()

hallo mojo1987,
in case of 'false' : neue daten werden als 'neu' gekennzeichnet, geänderte als 'geändert' was aber noch nicht heisst, dass die daten in dei datenbank übernommen werden.
könnten sein.
aber wie bekomm ich dann die daten in meine datenbank ?
'false' hat in der vergangenheit nicht geschadet, erst seit ich meine CDataBase-klasse in eine dll gepackt habe haut das nicht mehr hin.
wobei das lesen aus der datenbank einwandfrei funktioniert.
 
Preisfrage: Wo liegt der Unterschied in

dsPro.Tables["tblCfg"];
und
dsPro.tblCfg

sowie

taCfg.Update(dsPro.tblCfg);
und
taCfg.Update(dt);?

An welcher Stelle werden dsPro und taCfg initialisiert?
 
hallo darlis,
zu dsPro.tblCfg : im programm heisst das dsPro.Tables[tablename] denn das dataset enthält mehrer tabellen

zu taCfg.Update : dt und dsPro.tblCfg sind ein und dasselbe. dsPro.tblCfg gibt's schon seeeehr lange. dt gibt's seit ich LoadDataRow
für ALLE tabellen ALLER datasets verwende.

initialisiert wird in den ersten drei zeilen ( den new-teil hab ich weggelassen, ebenso taCfg.Fill )

beim debuggen ist mir aufgefallen : tblCfg enthält 4 spalten + 1 autoinc spalte.
übergebe ich bei LoadDataRow ein array mit 4 elementen erhlte ich einen laufzeitfehler
übergebe ich 5 elemente erhalte ich keine autoinc-wert, sondern bei null -1 oder bei numerischem wert eben diesen
wert. möglicherweise wird der autoinc-wert erst bei taCfg.Update() erstellt, aber da kann ich nicht prüfen.
kannst du dazu was sagen ?
mfg franz
 
aw48 schrieb:
zu dsPro.tblCfg : im programm heisst das dsPro.Tables[tablename] denn das dataset enthält mehrer tabellen
Das erklärt aber nicht, warum mal so und mal so auf die Tabelle zugreiftst. Wenn ich soetwas sehe, drängst sich mir der Verdacht auf, derjenige hat das Prinzip nicht verstanden und einfach nur den Code kopiert.

aw48 schrieb:
beim debuggen ist mir aufgefallen : tblCfg enthält 4 spalten + 1 autoinc spalte.
Das Autoincrement scheint das Problem zu sein. Google liefert da einige Ergebnisse, das MS da was verbockt hat. Du müsstest wahrscheinlich die letzte ID aus der DB lesen und das DataSet damit entsprechend konfigurieren, damit neue Zeilen auch korrekt geschrieben werden können. Wenn aber mehrere solche Einfügeoperationen parallel erfolgen, kann das zu Problemen führen.

Eine Alternative wäre noch, du schreibst dir eine Insert-Methode, die nur einen Datensatz in die DB einfügt, ohne Increment-Spalte. Diese wird dann von der DB selbst gefüllt. Du müsstest dann das DataSet durchlaufen und alle Zeilen mit Status "Neu" so einfügen.
 
ich google schon seit mehr als einer woche was 'loaddatarow' betrifft und hab noch nie etwas von autoincrement-problemen gelesen.
hast du da vielleicht einen link ?
 
Das Problem betrifft auch nicht direkt LoadDataRow sondern generell neue Zeilen, wenn Autoincrement im Spiel ist.

Hier die offizielle Lösung von msdn (Absatz AutoIncrement-Spalten) und hier ein Kommentar dazu, warum das nicht (mehr) funktioniert.
 
Zurück
Oben