Announcement

Collapse
No announcement yet.

C# und Access Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C# und Access Datenbank

    Hallöchen,

    Ich habe ein Problem mit DataSets einer Access-Datenbank. Die Datenbank ist als normale Datei vorhanden (data.mdb) und daraus habe ich über den Designer eine Data.xsd erstellt, in welche ich meine DataTables und TableAdapter erstellt habe.

    Funktioniert alles soweit auch, also ich kann nach Daten suchen, Queries abschicken, Parameter eingeben etc.

    Aber was einfach nicht funktionieren will, ist neue Daten einzugeben oder welche zu aktualisieren.

    Ich instanziere meinen TableAdapter, den ich im Designer erstellt habe (als connection meine Datenbankdatei)

    Code:
    UsersTableAdapter usersTable = new UsersTableAdapter();
    Dem habe ich eine InsertQuery hinzugefügt, um neue User reinzuschreiben. Aber wenn ich diese aufrufe

    Code:
    usersTable.InsertQuery(...);
    Passiert nichts. Es wird nichts in die Datenbank geschrieben, aber ich erhalte weder eine Exception noch sonst eine Meldung. Im Gegenteil, der Rückgabewert der InsertQuery sagt sogar, dass es erfolgreich ausgeführt wurde.

    Ich habe schon versucht, danach das gesamte DataSet zu aktualisieren, aber das hat ebenfalls nichts bewirkt.

    Code:
    usersTable.Update(data.users);

  • #2
    Hallo und willkommen,

    dein Problem kann viele Ursachen haben.

    1. Bezieht sich die DataTable auf eine Tabelle der Datenbank, oder sind durch einen SELECT-Befehl mit JOIN mehrere Tabellen verknüpft worden? Letzteres kann dazu führen, dass das INSERT nicht direkt funktioniert.

    2. Wie sieht der SQL-Befehl aus, der sich hinter InsertQuery versteckt? Das ist eines der Probleme des TableAdapter, dass man nicht erkennt, was wirklich gemacht wird.

    3. Wodurch soll das Speichern ausgelöst werden? Wenn du dich in der GUI noch innerhalb eines Datensatzes befindest, muss die Bearbeitung mit EndEdit abgeschlossen werden; erst danach erkennt das DataSet, dass etwas gespeichert werden kann und soll.

    4. Gerade bei Access passiert es oft, dass beim Neustart (oder nach einem erneuten Kompilieren) die aktuelle Datei durch die Ursprungsdatei überschrieben werden. Dazu gibt es irgendwo eine Einstellung "copy if newer" o.ä.; schau einmal die Eigenschaften der Datenbank im Projekt-Explorer durch.

    Viel Erfolg! Jürgen

    PS. Datenbank-Probleme gehören fast immer ins Unterforum ADO.NET; ich verschiebe die Diskussion deshalb.

    Comment


    • #3
      1. Nein, einfach ein Adapter für eine Tabelle
      2.
      Code:
      INSERT INTO `Users` (`name`, `password`) VALUES (?, ?)
      Ich habe diese Abfrage schon in Access als Abfrage erstellt, da werd ich nach den Parametern gefragt, gebe sie ein und schon ist ein neuer Datensatz in der Tabelle
      3. Ich bin mir nicht sicher ob ich verstehe was du meinst. Theoretisch löst Update() eine Aktualisierung der Datenquelle aus, und die während des Programms veränderten Rows werden anhand ihres RowStates in die Datenbank geschrieben / aktualisiert / gelöscht.
      Ich habe mal eine halbwegs durchgehende Debugmeldung eingebaut, vielleicht erkennt jemand darin etwas
      Code:
      // DataSet1 uses the connection to the Database.mdb
      // Created by the Designer
      
      // The Users table has 3 columns, id, name and password
      
      DataSet1 set = new DataSet1();
      UsersTableAdapter adap = new UsersTableAdapter();
      DataSet1.UsersRow row = set.Users.AddUsersRow("asd", "asd");
      int count = adap.Insert("das", "das");
      MessageBox.Show(row.RowState.ToString() + ": " + count.ToString());
      count = adap.Update(set.Users);
      set.AcceptChanges();
      MessageBox.Show(row.RowState.ToString() + ": " + count.ToString());
      
      // The Messagebox shows: "Added: 1"
      // The second one: "Unchanged: 1"
      
      MessageBox.Show(set.Users.Rows.Count.ToString());
      
      // Returns "2"...
      4. Daran hab ich nicht gedacht, werde ich machen wenn ich wieder im Büro bin.

      Comment


      • #4
        Access hat ein bescheuertes Caching verhalten so das Daten zwar in der DB geschrieben sind, aber erst sehr zeitverzögert anderen Abfragen zur verfügung stehen.
        Evtl. kannst du ja mal folgenden Code auf C# umschreiben um dein Glück zu versuchen.
        Frage: Wieso überhaupt Access. Unter .NET bietet doch MS mit der MS SQL Server Everywhere eine bessere Alternative an.

        Comment


        • #5
          Das ist mir klar, nur leider ist es vom Kunden vorgeschrieben, da er die Datenbank auch ohne das Programm bearbeiten können will. Und da er nunmal nur Access kennt und keinen Plan von MSSQL hat... Nunja, User halt -.-"

          Zurück zum Problem: Wie so oft war es einfacher als gedacht. Ich habe die Datei in meinem Projektexplorer überprüft, ob sie aktualisiert wurde.

          Das ist natürlich total behämmert, da diese ja beim kompilieren in den Debugordner kopiert wird und dort verändert wird. Und das klappt alles einwandfrei.

          Peinlich

          Comment


          • #6
            Hallo,

            verstehe ich richtig, dass das von mir unter Punkt 4 genannte Problem die Ursache war?

            Ergänzende Erklärung zu Punkt 3: Update mit Interpretion von DataRowState geschieht aus DataSet/DataTable heraus. Dazu müssen die letzten Änderungen aus der GUI (TextBox, DataGridView oder was auch immer) vorher in der DataTable landen. Dies geschieht entweder durch das Wechseln des aktuellen Datensatzes oder durch EndEdit. Andernfalls stehen die letzten Änderungen zwar in der TextBox usw., aber noch nicht in der DataTable; in einem solchen Fall steht DataRowState noch auf Unchanged.

            Das ist oft verwirrend. Man muss es wissen, um die Maßnahmen richtig auslösen zu können.

            Gruß Jürgen

            Comment


            • #7
              Der Ansatz war der gleiche - mir war klar, dass die Datenbank immer neu reinkopiert wird, aber um zu überprüfen, ob die Datensätze geschrieben wurden, habe ich immer in der Ursprungsdatei nachgesehen anstatt in der, die neu kopiert wurde.

              Comment

              Working...
              X