Wolle Geschrieben 3. Februar 2003 Geschrieben 3. Februar 2003 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. Zitieren
Der Kleine Geschrieben 3. Februar 2003 Geschrieben 3. Februar 2003 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. Zitieren
Wolle Geschrieben 3. Februar 2003 Autor Geschrieben 3. Februar 2003 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. Zitieren
Der Kleine Geschrieben 3. Februar 2003 Geschrieben 3. Februar 2003 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. Zitieren
Wolle Geschrieben 3. Februar 2003 Autor Geschrieben 3. Februar 2003 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. 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 Zitieren
Wolle Geschrieben 4. Februar 2003 Autor Geschrieben 4. Februar 2003 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). 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". Zitieren
Empfohlene Beiträge
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.