Update auf eine Access-Abfrage mit dem BindingNavigator

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von siedler89.

    Update auf eine Access-Abfrage mit dem BindingNavigator

    Guten Tag!



    Ich versuche das Update auf eine Abfrage hin zu bekommen, im DataSet,

    habe ich explicit die z.B. Mitarbeiter als PrimaryKey deklariert. Die Mitarbeiter ist ja auch der tatsächliche Primarykey.



    Aber leider bekomme ich immer die Fehlermeldung :



    TableAdapterManager enthält keine Verbindungsinformationen. Legen Sie
    jede TableAdapterManager TableAdapter-Eigenschaft auf eine gültige
    TableAdapter-Instanz fest.



    Das gleiche Vorgehen auf eine zugrundeliegende "echte" Tabelle geht tadellos.

    Codeausschnitt:


    VB.NET-Quellcode

    1. Private Sub Tb_vorgang_cl_feedbackBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles Tb_vorgang_cl_feedbackBindingNavigatorSaveItem.Click
    2. Me.Validate()
    3. Me.Tb_vorgang_cl_feedbackBindingSource.EndEdit()
    4. Me.TableAdapterManager.UpdateAll(Me.Ticket_Quality_Tool_backendDataSet)
    5. End Sub




    .......



    Kann mir jemand sagen, ob ein Update auf eine Abfrage hin(Access)

    überhaupt geht von VB.NET aus? Bzw. Wie ich das zum Laufen bringen könnte

    gruß Siedler
    meinst du auf eine in der Access-DB gespeicherte Abfrage?

    naja, wenn es ein Update-Command ist, dann kann mans natürlich ausführen.
    Aber ich vermute, du hast da eine Select-Abfrage hinterlegt, und ein Select ist halt ein Select und kein Update.

    Sowohl Selecten als auch Updaten kann man nur die Tabellen direkt.

    Wenn du dich mitte TableAdapter gut auskennst, kannst du vlt. händisch da iwelche kunstvolle Update-Commands rein-konfigurieren - k.A. - habich noch nie gemacht.
    Hallo siedler89,

    ich verwende recht häufig Access-Datenbanken und regle dabei alle Abfragen über die TableAdapter und dann LinQ2DataSet. Ein Beispiel für ein Update wäre:

    Verbindung zum typisierten DataSet

    VB.NET-Quellcode

    1. Public Function GetContext() As basarDataSet Return New basarDataSet
    2. End Function



    Dann das Update:

    VB.NET-Quellcode

    1. Public Sub BenutzerÄndern(ByVal entity As Benutzerliste) Using db = GetContext() Dim ta = New basarDataSetTableAdapters.BenutzerTableAdapter() ta.Fill(db.Benutzer) Dim q = (From x In db.Benutzer _ Where x.ID = entity.ID _ Select x).SingleOrDefault() With entity q.Benutzername = .Benutzername q.Passwort = .Passwort q.Vorname = .Vorname q.Nachname = .Nachname q.RollenID = .RollenID q.aktiv = .aktiv
    2. End With ta.Update(q) ta.Dispose() db.Dispose()
    3. End Using
    4. End Sub



    Die Benutzerliste ist dabei eine Abfrage in Access, die ich einfach per Drag&Drop auf das typisierte DataSet gezogen habe. Über die Eigenschaften, die in dieser Abfrage stecken, kann ich dann ein Update auf die eigentliche Tabelle machen.
    Der Vorteil dieser Methode ist, dass Du mit typisierten Eigenschaften arbeiten kannst, die Dir im Intellisense zur Verfügung stehen. Tippfehler sind damit ausgeschlossen... Ach ja, und so funktioniert ein INSERT:

    VB.NET-Quellcode

    1. Public Sub BenutzerEinfügen(ByVal entity As Benutzerliste) Using db = GetContext() Dim ta = New basarDataSetTableAdapters.BenutzerTableAdapter() ta.Fill(db.Benutzer) Dim dt = db.Benutzer Dim ii = (From y In db.Benutzer _ Where y.Benutzername = entity.Benutzername _ Select y).Count() If CInt(ii) = 0 Then Dim x As basarDataSet.BenutzerRow = dt.NewBenutzerRow() With entity x.Benutzername = .Benutzername x.Passwort = .Passwort x.Vorname = .Vorname x.Nachname = .Nachname x.RollenID = .RollenID x.aktiv = .aktiv
    2. End With dt.AddBenutzerRow(x) ta.Update(dt)
    3. Else MessageBox.Show("Der eingegebene Benutzer existiert schon." & vbNewLine & _ "Bitte wählen Sie einen anderen Benutzernamen.", "Benutzer existiert schon", _ MessageBoxButtons.OK, MessageBoxIcon.Information)
    4. End If ta.Dispose() db.Dispose()
    5. End Using
    6. End Sub



    Vielleicht hilft Dir das ja.
    Gruß
    Marcus
    Hallo zusammen,

    ich hab mir über Ostern nochmal gedanken gemacht.
    eigentlich muss das doch über den normalen Datatable funktionieren?

    ich hab auch die Abfrage in VB zusammen gestellt (nicht die von Access importiert)

    hier mal paar bilder wie meine sache so aussieht:

    Bild 1:
    so sieht es aus wenn ich noch nix gemacht habe
    Bild 2:
    nehm ich die ErstellerID raus und möchte mir nur den Kürzel anzeigen (benötige ich später für den filter)
    Bild 3:
    Speicherbutton wird von VB schon automatisch deaktiviert


    vielleicht heißt der kleine einblick für mehr hilfe :)

    danke
    Bilder
    • 1.jpg

      94,01 kB, 704×831, 223 mal angesehen
    • 2.jpg

      116,74 kB, 707×752, 238 mal angesehen
    • 3.jpg

      32,19 kB, 678×329, 240 mal angesehen
    Die TableAdapter generieren selbsttätig ein UpdateCommand anhand des Select-Abfrage, was man ihnen gibt.
    Aus einer mittels InnerJoin erstellten Abfrage kann aber kein UpdateCommand generiert werden, denn die Werte werden ja aus 2 Tabellen bezogen, und da weiß der CommandBuilder nicht, wie die Werte zuordnen.

    Lösung: Auf InnerJoin-Abfragen verzichten, und stattdessen die Tabellen getrennt abrufen, und die JoiningViews im DatagridView zusammen basteln - mittels DatagridViewComboboxColumns.