Laden...

Problem: Änderungen an Access-Datenbank werden nicht übernommen

Erstellt von chribl vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.820 Views
C
chribl Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren
Problem: Änderungen an Access-Datenbank werden nicht übernommen

verwendetes Datenbanksystem: Access

Eigentlich ist die Aufgabe simpel: Ein Datensatz soll in eine Access-Datenbank eingefügt werden.
Bei Klick auf einen Button werden die Daten von der Quelle ausgelesen und der Datensatz geschrieben. Ich habe das jetzt sowohl mit Command-Objekt als auch über TableAdapter versucht, beides funktioniert zunächst scheinbar ohne Probleme. Ich habe ein DataGridView-Element, in dem die Änderungen korrekt angezeigt werden.
ABER: Die Daten werden nicht in die eigentliche Access-Datei übernommen. Und um die Verwirrung vollständig zu machen... Manchmal sind die Daten trotzdem beim nächsten Programmstart noch vorhanden. Manchmal auch nach zwei Starts, aber irgendwann sind sie weg und in Access kommen sie nie an.
Verbindung zu Access besteht. Daten, die dort bereits liegen werden angezeigt. Die Datei ist auch nicht schreibgeschützt oder so.

Ich weiß nicht, ob mein Code hier irgendwie weiterhilft. Gerade beim Schreiben mit Command-Objekt weiß ich wirklich nicht, was man da anders machen könnte. Und es läuft ja auch fehlerfrei durch. Die Lösung mit TableAdapter würde ich nachliefern, wenn sie jemand braucht (ist ein bisschen aufwändig zusammenzu kopieren). Aber beide liefern dasselbe Ergebnis.

Schreiben per commandObject


string columns; // enthält die Spaltennamen in der Form "Spalte1, Spalte2, ..."
string values; // enthält die Werte in der Form "12, 6, 'käsebrötchen', 0, ..."
string comStr = "INSERT INTO Ergebnis(" + columns + ") VALUES(" + values + ")";
OleDbCommand cmd = new OleDbCommand(comStr, con_lokal);
con_lokal.Open();
cmd.ExecuteNonQuery();
con_lokal.Close();

Bitte fallt nicht über die Tatsache her, dass ich Access verwende. Das ist ein Punkt auf den ich keinen Einfluss habe. Das gleiche hab ich auch schon mit einer MS-SQL Datenbank gemacht, da funktioniert alles problemlos. Access ist sch***, verwenden muss ich es trotzdem, ändert also nichts an meinem Problem.

S
93 Beiträge seit 2008
vor 8 Jahren

Das liegt daran, daß Jet-Engine als Programm im Hintergrund arbeitet, und die Daten oft nicht sofort in die Datenbank schreibt.
Erst nach einer gewissen Zeit (keine Ahnung wann), spätestens nach Programm-Ende und dem Schliessen der DB wird das Ganze dann körperlich geschrieben.
Deswegen findest du erst viel später, bzw. nach Programm-Ende und Neustart die Daten erst wiedere in Access.

Es gibt da zwei Möglichkeiten:

  1. Du packst den Speichervorgang in eine Transaction mit anschliessenden Commit. (da schreibt die Engine die Daten sofort)

  2. oder, wenn nichts dagegen spricht nimmst Du eine richtige SQL-Datenbank wie z.B. SQLServer, SQLite usw.

6.911 Beiträge seit 2009
vor 8 Jahren

Hallo chribl,

ich will die 2. Möglichkeit die san-software genannt hat bestärken!
Access ist keine Datenbank und sollte tunlichst vermieden werden - das kannst du hier im Forum des öfteren nachlesen, solltest du das nicht glauben.

Hallo san-software,

Erst nach einer gewissen Zeit (keine Ahnung wann)

Wenn der Buffer voll ist 😉 Deterministisch ist es aber nicht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

R
317 Beiträge seit 2006
vor 8 Jahren

Hallo chribl,

Ich behaupte jetzt einfach mal dass das nichts mit dem Programmieren zu tun hat. Kann es sein, dass die Access-Datenbank, also das MDB File zu deinem C# Projekt gehört, also im Visual Studio im Projekt eingebunden ist? Und sich die MDB auf diedu im Programm zugreifst im gleichen Ordner befindet wie deine EXE Datei?

Falls ja, ist in den Eigenschaften der Datei im Visual Studio eventuell eingestellt dass die Datei beim erstellen des Projektes neu in das Ausgabeverzeichnis kopiert wird - und damit deine Änderungen wieder überschreibt.

Prüf das auch mal - hört sich für mich sehr stark danach an.

Daniel