Laden...

DataAdapter.Update(DataTable) - Probleme

Erstellt von Informatikhexe vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.435 Views
I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren
DataAdapter.Update(DataTable) - Probleme

Hallo,

erstmal das übliche: Ich habe ein

this.vertragTableAdapter.Update(this.handelDataSet.Vertrag);

das nicht funktoniert, wobei ich versuche bei einer meiner Access - Datenbank-Tabellen eine Zeile hinzufügen.
Dann habe ich mir erstmal den this.handelDataSet.Vertrag mit dem Debugger angesehen -> alles da
Durch Forumsuche bin ich auf die Idee gestoßen, noch vorher

row.AcceptChanges(); row.SetModified();

einzubauen.
Jetzt bekomme ich eine Exception:
DBConcurrencyException: Das CommandUpdate hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.
Dann habe ich mir mit dem Debugger per TestVisualizer mal den "this._adapter.UpdateCommand.CommandText" angeschaut. Dort steht aber hinter jeder Spaltenbezeichnung nur "= ?".

  1. Stimmt meine Vermutung, dass das heisst, dass das meine neu eingegebenen Werte für die Zeile nicht übernommen werden?
  2. Sollte eigentlich irgendwas in der WHERE-clause stehen?
  3. Kann irgendjemand was mit der Exception anfangen?

Die msdn - Hilfe bringt mich auch nicht weiter.

Herausgefunden: die Exception hat das SetModified(); als Ursache. Übrigens: Bei der Exception steht auch noch "Parallelitätsverletzung"!

Vielen Dank im Voraus für jegliche Unterstützung.

Viele Grüße
Informatikhexe

2.082 Beiträge seit 2005
vor 17 Jahren

Hallo Informatikhexe,

wie sieht deine Struktur aus? Befüllst du erst das DataSet per Adapter und bindest die Tabelle dann an ein GridView?

Da deine Tabelle Vertrag heißt, gehe ich davon aus, dass du ein typisiertes DataSet benutzt. Stimmt das DataSet mit der Access-Datenbank überein? Also Tabellen, Columnanzahl, Datentypen der Columns usw.

Prüf das mal nach.

this.vertragTableAdapter.Update(this.handelDataSet.Vertrag);  

Wirft die Zeile eine Exception? Wenn ja welche?

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Das DataSet wird ganz am Anfang automatisch per genau diesem TableAdapter befüllt.
Und ja, ich befülle ein GridView.

Da alles mit dem Designer gemacht worden ist, stimmt alles 100% überein.

Die Zeile wirft keine Exception, wenn ich statt row.setModified nur row.SetAdded nehme.

F
10.010 Beiträge seit 2004
vor 17 Jahren

Wie ich schon in dem anderen Posting schrieb ist diese herangehesweise grosser
Schwachsinn.

AcceptChanges löscht alle RowStates des gesammten DataSet, und ist nur gedacht
für Situationen, in denen Du exact weisst was Du tust.

Interessanter wäre eher, wie/Wo fügst Du die Zeile der DataTable hinzu?

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Genau aus dem Posting habe ich das, mir fiel nichts bessseres ein und bessere Lösungsvorschläge gab es bisher nicht (und bei demjenigen hat es ja funktioniert).

vertrag.Rows.Add(row);

Das ist alles. Den Row-Inhalt habe ich aus Textboxen ausgelesen.
Und das einfügen in die DataTable funktioniert, habe ich mir im Debugger angesehen und in meiner gridView.
Aber irgendwas stimmt an meinem Update nicht, obwohl ich alle Funktionen Insert, Delete und Update habe erstellen lassen 🤔

Vielen Dank, dass Du versuchst zu helfen.

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Ich versteh das nicht, so wie es aussieht, wurde in die DataTable alles übernommen, aber das Update ignoriert das einfach X(

F
10.010 Beiträge seit 2004
vor 17 Jahren

Nur so als frage, Du hast bedacht ( wie hier auch schon hundertfach beschrieben)
das eine in der Solution befindliche Datenbankdatei ( MDB oder MDF ) bei jedem
Programmstart ins Ausführungsverzeichnis copiert wird!

Danach stehen natürlich die Änderungen nicht mehr in der DB.

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Das habe ich noch nie verstanden, was das heissen soll.
Das DataSet holt doch seine Daten, wenn ich das Programm starte. Während des Programmablaufes ändere ich etwas und gebe dies per Update zurück. Und damit sollte das doch persistent in der Datenbank gespeichert sein, während ich das Programm weiterlaufen lasse oder jetzt beende?!

2.082 Beiträge seit 2005
vor 17 Jahren

Überprüfe doch einfach mal alles.

-Änderungsdatum der mdb-Datei vor und nach dem .Update
-Typisiertes DataSet genauso aufgebaut wie die Datenbank
-Einfach mal einen Datensatz per code in die Datei speichern
-Der neue Datensatz auch wirklich im DS vorhanden

Irgendwo musst du einen Denkfehler im QC haben sonst würde dir der Debugger wenigstens eine Exception melden wenn du einen Fehler gemacht hättest.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Am Datum ändert sich nichts -> wird darin liegen, dass die UpdateQuery leer ist, ich verstehe nur nicht warum sie leer ist.

Tabelle und TableData überprüft -> nicht zu wenig und nicht zu viel

2.082 Beiträge seit 2005
vor 17 Jahren

Wo setzt du das Update-Command?

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

F
10.010 Beiträge seit 2004
vor 17 Jahren

@Informatikhexe:
Was ist daran so schwer zu verstehen?

Eine Datenbank bei Access und deim Sql-Express ist eine Datei.
Wenn Du die in deinem Projekt hast, wird diese Datei vor jedem start
aus der IDE in das Debug Verzeichnis kopiert.
Dann sind deine Änderungen vom letzten mal futsch.

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Guten Morgen,

Wenn ich die Zeile in das DataTable eingefügt habe, mache ich zuerst

grid1.dataSource = this.handelDataSet.Vertrag;

Und dann kommt die bekannte Update - Zeile.

2.082 Beiträge seit 2005
vor 17 Jahren

Warum bindest du das grid neu an die DataSource? Ist in dem Fall völlig überflüssig. Einmal binden reicht.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Hallo,

wenn ich was in dem Grid geändert habe, muss ich den DataSource nochmal neubinden, weil siche sonst die Anzeige nicht ändert.

Gruß
Informatikhexe

2.082 Beiträge seit 2005
vor 17 Jahren

Nein musst du nicht. Einmal gebunden passt sich das Grid automatisch an.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Hey,

sie tut es aber nicht. Sie macht es nicht. Hat keine Lust oder so ...
Keine Ahnung, aber so klappts.
Oder kann das was mit dem leeren Update zu tun haben?

2.082 Beiträge seit 2005
vor 17 Jahren

Oder kann das was mit dem leeren Update zu tun haben? Nein. Bist du sicher, dass das Grid breits gebunden ist? Debugge das mal und sieh dir die DataSource-Property an. Entweder ist sie nicht gebunden oder du zerstörst das gebundene Objekt irgendwann...

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Hallo,

danke, das war was mit dem DataBinding schief, deshalb gings im Grid nicht automatisch, jetzt aber schon.
Leider funktioniert das Update trotzdem nicht, er übernimmt die Werte immer noch nicht in die Update-Query 🙁

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Hallo nochmal,

ich nehme ja jetzt meine Werte aus den Textboxen, schreibe sie in die DataTable, und mache dann ein Update, bei der eine leere Query (Debugger) das Problem ist, wobei ich aber nicht rauskriege, warum die Query leer ist.
Gibt es eine Möglichkeite das Update über das DataBinding des Grid zu machen???

Grüße
Iris

2.082 Beiträge seit 2005
vor 17 Jahren

Nicht dass ich wüsste. Das DataSet selbst hat ja keinen ConnectionString sondern die DataSource.

Bist du sicher dass du den Adapter richtig benutzt? Gibts du dem Adapter überhaupt ein Select Statement?

Schau dir mal den Beitrag in der MSDN an. Update Command

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Hey,

ich meine ja (der link funktioniert nicht).
Der Adapter hat ein select, ein Update, ein Insert, und ein delete-statement. Ist im Adapter selber per debugger einsehbar und hab ich mir auch schon im Code angesehen. Zum Debugger: Das Problem ist, da stehen keine Werte drin, sondern nur: SET UPDATE vertragID = ?, vertragName = ? usw. und das an der Stelle, wo Werte drin stehen müssten.
Und ich kriege nicht raus, warum nicht.

Grüße
Informatikhexe

T
512 Beiträge seit 2006
vor 17 Jahren

Du benutzt den System.Net.Odbc Provider und bei diesem werden Parameter mit ? markert. Die Parameter werden dann erst beim Ausführen der Commands eingesetzt. Es ist da also alles in Ordnung.

Muss man nicht erst einen DbCommandBuilder (OdbcCommandBuilder) mit dem Adapter verbinden, damit das Update automatisch funktioniert?

e.f.q.

Aus Falschem folgt Beliebiges

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Hallo,

ich kann mir mit dem Debugger BEI/WÄHREND der Ausführung des Commands den Inhalt ansehen. Wieso soll ich dem mit CommandBuild bauen? Ich hab dem Designer haarklein gesagt, er soll mir das bauen, und jetzt gibt es 5 verschiedende Updates für genau diesen einen TableAdapter.
aber bei
this.vertragTableAdapter.Update(this.handelDataSet.vertragTable);
holt er sich zwar alles, aber er führt das Update nicht aus, er geht nicht die die Update-Funktion rein, er tut da nix. Er läuft einfach nur gemütlich weiter.

T
512 Beiträge seit 2006
vor 17 Jahren

Ok mit Designern hab ich noch wenig zu tun gehabt. Ist eben der Vorteil wenn man sowas per Hand schreibt: Man weiß was da los ist.

Also wenn der Debugger nicht gerade auf der Datenbank läuft und du die eingehenden Befehle siehst, würde ich mal sagen du täuschst dich. Der CommandText des DbCommands ändert sich nie, auch nicht bei der Ausführung. Ich bezweifle ernsthaft, dass du das irgendwie in deinem Code beobachten kannst, an welcher Stelle das dann passiert.

e.f.q.

Aus Falschem folgt Beliebiges

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

klar, ich schreib 23000 Zeilen Code per Hand (nur das DatenbankDesign)

I
Informatikhexe Themenstarter:in
49 Beiträge seit 2006
vor 17 Jahren

Und was passiert dann da, wenn in der DB nichts passiert?!

E
265 Beiträge seit 2004
vor 17 Jahren
  • Ist der RowState einer row Added oder Modified? (vorm adapter.Update( ... ); nachschauen.)
  • Nach dem adapter.Update( ... ) nachschauen ob Fehler aufgetreten sind. dataSet.dataTable.GetErrors();
T
512 Beiträge seit 2006
vor 17 Jahren

Dein Problem ist, dass du nicht die geringste Ahnung hast was da passiert und es auch nicht rausfinden willst. Von den 23000 Zeilen Code ist über die Hälfte einfach nur dazu da, damit du weiter im Designer rumklicken kannst um z.B. DataBindings damit zu setzen. Eine überaus anspruchsvolle Aufgabe die 1 Zeile Code beansprucht. Von dem Rest sind locker 90% für den typisierten Zugriff auf die Spalten.

Eine Anwendung die eine DataTable aus der Datenbank in einem DataGridView anzeigt, braucht für den Zugriff auf die Datenbank kaum 15 Zeilen Code wenn man das per Hand macht. Und dann kommt pro DataBinding eine Zeile Code dazu...

Und nochmal abschließend: Mit den ? ist alles korrekt, der Fehler liegt nicht dort.

e.f.q.

Aus Falschem folgt Beliebiges