oxygen Geschrieben 28. August 2010 Geschrieben 28. August 2010 Hallo, wie schon des Öfteren hab ich mal wieder Probleme mit dem Thema C# und Access. Diesmal ist es folgendes: Ich sitze (noch immer) an meinem Projekt "Feuerwehrverwaltung", was eine kleine Anwendung zum Verarbeiten von Personaldaten einer freiwilligen Feuerwehr werden soll. Nachdem ich festgestellt habe, dass ich lange Zeit die Access-Datenbank, die ich als Datenhaltung nutze, nicht lesen konnte, weil ich das Projekt in 64Bit kompiliert habe, habe ich nun das Problem in die andere Richtung: Ich kann Daten, die ich verändert habe, nicht in die DB zurück schreiben, sie werden einfach nicht angenommen. Hier der relevante Code dazu: private void button1_Click(object sender, EventArgs e) { int anzahlp,anzahld = 0; persönlichBindingSource.EndEdit(); dienstlichBindingSource.EndEdit(); anzahlp = persönlichTableAdapter.Update(feuerwehrverwaltungaccess2000DataSet.persönlich); MessageBox.Show(anzahlp.ToString()); anzahld=dienstlichTableAdapter.Update(feuerwehrverwaltungaccess2000DataSet.dienstlich); MessageBox.Show(Convert.ToString(anzahld)); } Die Datenbank besteht aus 2 Tabellen: persönlich und dienstlich. Wie zu sehen ist, habe ich jeweils einen Table Adapter. anzahlp und anzahld dienen lediglich dazu, schnell überprüfen zu können, ob die Daten geschrieben wurden. Nun zu den Rahmenbedingungen: Ich entwickle unter Visual Studio 2008 auf einem Rechner mit Windows 7 64Bit Home Premium, die Access-DB ist im Format 2000, aber unter 2007 geschrieben. Dies ist so, damit andere die DB selbst auch öffnen können, wenn nötig. Woran könnte das liegen, hab schon die Berechtigungen der Access-Datei überprüft, aber eigentlich hat jeder Schreibrechte. Habe vor Kurzem den Tipp bekommen, mal die Eigenschaften in Access zu überprüfen, hab da aber nix gefunden, was mich weiter gebracht hat. Ich hoffe, ihr könnt mir einen Tip geben, damit das Projekt endlich mal fertig wird, es fehlen wirklich nur noch die Funktionen einen Eintrag zu ändern und einen neuen Hinzuzufügen. Gruß und schonmal danke Zitieren
Gateway_man Geschrieben 31. August 2010 Geschrieben 31. August 2010 Hallo, nutzt du ODBC für die Verbindung zu Access? Wenn ja, lass dir sagen das dein 64 Bit Hostsystem auf dem du entwickelst, über keine ODBC treiber verfügt, da diese AFAIK nur für 32 Bit Systeme existieren. Ansonsten wäre es nett wenn du mal ein bisschen mehr von deinem Code zeigen würdest. Beispielsweise den Teil, wo du die Daten deines Tables änderst. Wirft der Debugger denn einen Fehler (auch auf die Ausgabe achten, sofern du Fehlerhandling einbunden hast)? Wenn ja, dann poste bitte mal die genaue Meldung. Lg Gateway Zitieren
oxygen Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 Bewusst nutze ich kein ODBC. Ich habe die Datei über eine DataSource eingebunden, diese generiert mir dann ja Table Adapter und das ganze drum herum, höchsten die macht standardmäßig ODBC. Code kann ich mehr Posten, allerdings sitze ich grade an einem anderen Rechner, mach ich aber ASAP, genau so, wie die Debugger-Meldungen nochmal anzuschauen, ist mir bis jetzt noch nichts aufgefallen. Auf jeden Fall schonmal Danke für den Tip, wo ich noch schauen sollte. Zitieren
Iceman346 Geschrieben 1. September 2010 Geschrieben 1. September 2010 Ich hatte in meinem Abschlussprojekt ein ähnliches Problem. Ich hatte direkt über die BindingSource einige Werte der DB geändert und .EndEdit() aufgerufen. Bei mir wurden die Änderungen dann nur teilweise übernommen. Ich hab das nur dadurch gelöst bekommen indem ich die Änderungen direkt am DataSet vorgenommen hab ohne auf die BindingSource zuzugreifen. IMO ist die EndEdit Funktion buggy bzw. funktioniert nicht korrekt. Zitieren
oxygen Geschrieben 2. September 2010 Autor Geschrieben 2. September 2010 Damit ihr wenigstens noch Infos bekommt, damit ihr mir vielleicht was sagen könnt: Hier der komplette Code der Form, in der ich in die DB schreiben will. Auf dem Form sind eingabe Felder (Textboxen, ComboBoxen, CheckBoxen, DateTimePicker), die über die Eigenschaften an die DataBindingSource angeknüpfts sind. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace FWVerwaltung { public partial class Form10 : Form { public Form10() { InitializeComponent(); } private void Form10_Load(object sender, EventArgs e) { // TODO: Diese Codezeile lädt Daten in die Tabelle "feuerwehrverwaltungaccess2000DataSet.persönlich". Sie können sie bei Bedarf verschieben oder entfernen. this.persönlichTableAdapter.Fill(this.feuerwehrverwaltungaccess2000DataSet.persönlich); // TODO: Diese Codezeile lädt Daten in die Tabelle "feuerwehrverwaltungaccess2000DataSet.dienstlich". Sie können sie bei Bedarf verschieben oder entfernen. this.dienstlichTableAdapter.Fill(this.feuerwehrverwaltungaccess2000DataSet.dienstlich); } private void button1_Click(object sender, EventArgs e) { int anzahlp,anzahld = 0; persönlichBindingSource.EndEdit(); dienstlichBindingSource.EndEdit(); anzahlp = persönlichTableAdapter.Update(feuerwehrverwaltungaccess2000DataSet.persönlich); MessageBox.Show(anzahlp.ToString()); anzahld=dienstlichTableAdapter.Update(feuerwehrverwaltungaccess2000DataSet.dienstlich); MessageBox.Show(Convert.ToString(anzahld)); } } } Ich bin noch nicht dazu gekommen, irgendwas zu überprüfen oder zu überarbeiten, da ich gestern ein Dualstudium angefangen habe und daher schon im Betrieb genügend mit Informatik zu tun hab. Muss mich da erst mal n bisschen dran gewöhnen. Vielleicht kann ich ja am Wochenende mal eure Tips anwenden. Trotzdem vielen Dank und Gruß Zitieren
2K1.INC Geschrieben 7. September 2010 Geschrieben 7. September 2010 hmm ganz blöde frage bist du sicher das .Update() die anzahl der geändertn Daten zurückliefert ? (selber ka darum frag ich ob du sicher bist) Weil vll wirds ja aktualisiert nur anzahlp & anzahld sind ja 0 gleich am anfang... sieht nur so aufn erstn blick aus als ob nur die ausgabe falsch wäre... Zitieren
oxygen Geschrieben 7. September 2010 Autor Geschrieben 7. September 2010 Also so wie ich das gelesen hab, gibt die Funktion die Anzahl der veränderten Zeilen zurück. Ausserdem hat sich auch nichts geändert, wenn ich die Datenbank anschau. Zitieren
2K1.INC Geschrieben 8. September 2010 Geschrieben 8. September 2010 die selectanweisung leifert aber was oder? Zitieren
oxygen Geschrieben 8. September 2010 Autor Geschrieben 8. September 2010 (bearbeitet) Wie oben schon gesagt funktioniert das Auslesen komplett -> die Select geht. Edit: und Werte sind auch Vorhanden, sie ist also nicht leer. Bearbeitet 8. September 2010 von oxygen Zitieren
oxygen Geschrieben 8. September 2010 Autor Geschrieben 8. September 2010 (bearbeitet) @Iceman346: könntest du mir da mal ein Codesegment als Beispiel, wie man direkt das DataSet verändert, posten? Hab ein Fehlerhandling eingebaut, es wird aber keine Exception ausgelöst. Ich glaube so langsam, dass ich das gleiche Problem habe, das Iceman346 beschrieben hat. Ansonsten hab ich mir auch schon überlegt, testweise die DB mal auf einen MSSQL-Server aufzusetzten und zu kucken, wie sich das ganze da verhält. Allerdings hängt da ein ziemlicher Rattenschwanz dran und nach 8h Informatik auf der Arbeit ist die Motivation nicht mehr so groß, deshalb wolle ich das erst als letzte Möglichkeit machen. Bearbeitet 8. September 2010 von oxygen Zitieren
Iceman346 Geschrieben 9. September 2010 Geschrieben 9. September 2010 Hier, ist allerdings VB.Net und nicht C# If sender.Equals(ButtonFirst) Then If pos > 1 Then For Each tmp As DataRow In SpeicherDataSet.tabBearb.Rows If tmp.Item("lngVariante") = TabVarianteBindingSource.Current("IDVar") Then If tmp.Item("intPosition") < pos Then tmp.Item("intPosition") = tmp.Item("intPosition") + 1 ElseIf tmp.Item("intPosition") = pos Then tmp.Item("intPosition") = 1 End If End If Next TabBearbTableAdapter.Update(SpeicherDataSet.tabBearb) QryMasterTableAdapter.Fill(SpeicherDataSet.qryMaster) DataGridWerk.Rows(0).Selected = True End If '... End If Der Code ist für einen Button der die Reihenfolge von Datensätzen, die in einem DataGridView dargestellt werden, verändert. Diese Reihenfolge sollte auch in der Datenbank gespeichert werden. Da ich keine Möglichkeit gefunden hab das DataSet selbst zu filtern durchlaufe ich jeden möglicherweise relevanten Datensatz, überprüfe ob ich ihn verändern muss und setze dann die Position um. 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.