Zum Inhalt springen

[C#] Datasource schreibt nicht in Access-Datei


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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ß

Geschrieben

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...

Geschrieben

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.

Geschrieben (bearbeitet)

Wie oben schon gesagt funktioniert das Auslesen komplett -> die Select geht.

Edit: und Werte sind auch Vorhanden, sie ist also nicht leer.

Bearbeitet von oxygen
Geschrieben (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 von oxygen
Geschrieben

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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...