Zum Inhalt springen

C#: Insert in AccessDB


Wolle

Empfohlene Beiträge

Hi,

ich spiele gerade (mal wieder) mit C# und Access rum (bin absoluter Anfänger was C# betrifft). System ist Visual Studio.net Beta unter Win XP SP1. Die AccessDB ist mit Access2000 erstellt.

In der DB ist nur eine Tabelle "Kunden" mit den Feldern ID (Autowert, Primärschlüssel), Vorname (Text) und Nachname (Text).

Ich habe eine WindowsForm (als dll) mit 2 Textfeldern für Vor- und Nachname und einen Button "Speichern".

Dann habe ich eine Klasse "Kunden" erstellt mit folgendem Quelltext:


public class Kunden

{

	public string Vorname;


	public string Nachname;


	public bool Speichern()

	{

		string commandString="Select id, Vorname, Nachname from Kunden;";

		string connectionString="provider=Microsoft.JET.OLEDB.4.0; data source=Kunden.mdb"; 


		OleDbDataAdapter myDataAdapter=new OleDbDataAdapter(commandString,connectionString);

		DataSet myDataSet = new DataSet();


		myDataAdapter.Fill(myDataSet,"Kunden");


		DataTable Tabelle=myDataSet.Tables["Kunden"];


		DataRow neuerSatz=Tabelle.NewRow();

		neuerSatz["Vorname"]=this.Vorname;

		neuerSatz["Nachname"]=this.Nachname;

		Tabelle.Rows.Add(neuerSatz);


		myDataSet.AcceptChanges();

		myDataAdapter.Update(myDataSet,"Kunden");


		return true;

	}

}

Beim Klick-Ereignis des Speichern-Button wird eine Instanz der Klasse erstellt, die Variablen Vorname und Nachname mit dem Inhalt der Textfelder gefüllt und Speichern() aufgerufen. Die Werte in "this.Vorname" und "this.Nachname" haben die gewünschten Werte (hatte einen Haltepunkt gesetzt und Werte überprüft).

Der Compiler gibt keine Fehlermeldung aus, aber die Werte werden nicht in die DB geschrieben. Die DB ist auch im richtigen Verzeichnis, bei einer anderen WindowsForm mit einem DataGrid werden die vorhandenen Datensätze angezeigt.

Laut dem Tutorial, das ich verwende sollte es eigentlich so stimmen. Vielleicht hat ja einer von euch eine Idee, warum die Datensätze nicht in die Accesstabelle geschrieben werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Wolle,

vielleicht nur ein paar mögliche Fehlerquellen, die sein könnten:

(1) Steht die OLE - Verbindung ? Kann man irgendetwas aus der ACCESS - Tabelle lesen?

(2) Ist Tabelle mit Werte gefült?

(3) (glaube entscheidend) :

Die Zeile :

myDataAdapter.Fill(myDataSet,"Kunden");
erst nach ausgefüllter Tabelle füllen lassen, also nach :
myDataSet.AcceptChanges();

Vielleicht klapps irgendwas.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke schon mal für deine Antwort :)

Originally posted by Der Kleine

(1) Steht die OLE - Verbindung ? Kann man irgendetwas aus der ACCESS - Tabelle lesen?

Ja, das klappt. Auf einer anderen Form fülle ich ein Datagrid mit den gleichen Verbindungsdaten. Der Quelltext ist da bis einschliesslich "myDataAdapter.Fill(myDataSet,"Kunden");" gleich, nur das danach eben die Daten in das DataGrid geschrieben werden.

Originally posted by Der Kleine

(2) Ist Tabelle mit Werte gefült?

Sollte eigentlich, zumindest wird bei einem Haltepunkt als Wert "System.Data.Datatable" und nicht NULL ausgegeben. Ausgeben kann ich da nichts (zumindest weiß ich nicht wie) da ich ja in einer Klasse und nicht in einer Form bin.

Originally posted by Der Kleine

(3) (glaube entscheidend) :

Die Zeile :

myDataAdapter.Fill(myDataSet,"Kunden");
erst nach ausgefüllter Tabelle füllen lassen, also nach :
myDataSet.AcceptChanges();
Leider auch nicht. "myDataAdapter.Fill...." liest die vorhandenen Daten aus der DB und schreibt sie in das DataSet und soweit geht es ja auch. "myDataSet.AcceptChanges()" bringt das DataSet dazu die Daten die nachträglich in das Dataset eingefügt wurden zu "Akzeptieren":
DataRow neuerSatz=Tabelle.NewRow();

		neuerSatz["Vorname"]=this.Vorname;

		neuerSatz["Nachname"]=this.Nachname;

		Tabelle.Rows.Add(neuerSatz);

Ich habs aber auch gerade ausprobiert, genau gleiches Ergebnis: Keine Fehlermeldung, aber auch keine Datensätze in der Datenbank.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Wolle

Danke schon mal für deine Antwort :)

:)

Originally posted by Wolle

Ausgeben kann ich da nichts (zumindest weiß ich nicht wie) da ich ja in einer Klasse und nicht in einer Form bin.

Also in [OT] Delphi [/OT] würde ich nen

Showmessage(Tabelle.cells(tabelle.colcount-1,0)+' : '+Tabelle.cells(tabelle.colcount-1,0));

- Befehl nutzen, ohne Formular.

Weil wenn klappt, happerts an der vorletzten oder letzten Zeile.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Der Kleine

Also in [OT] Delphi [/OT] würde ich nen

Showmessage(Tabelle.cells(tabelle.colcount-1,0)+' : '+Tabelle.cells(tabelle.colcount-1,0));

- Befehl nutzen, ohne Formular.

Stimmt auch wieder, auf die Idee bin ich gar nicht gekommen. :rolleyes:

Muß da nur erstmal suchen in welcher Klasse das wieder drinsteckt und was ich für einen Verweis setzten muß. Auf die schnelle hab ich das in der MSDN nur für VB.NET gefunden. Werd ich morgen abend mal probieren, für heute reichts mir ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Der Kleine

(2) Ist Tabelle mit Werte gefült?

Ich hab da noch mal rumprobiert. Die Ausgabe habe ich zwar nicht hinbekommen, da auf einzelne Zellen kein direkter Zugiff ist. Um da Werte rauszubekommen muß man laut der Fehlermeldung mit einem Indexer arbeiten, allerdings hab ich noch nicht wirklich Ahnung wie man damit arbeitet (ich vermute mal, das das eine Art Array ist). :rolleyes:

In dem Objekt "Tabelle" ist aber definitiv Inhalt. Wenn ich dem Objekt eine nicht vorhandenen Tabelle zuordne bekomme ich als Inhalt NULL zurück, mit der vorhandenen Tabelle eben "System.Data.Datatable".

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...