Access Datenbank in DataGridView anzeigen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Access Datenbank in DataGridView anzeigen

    Halli Hallo,

    ich habe irgendwie ein Brett vorm Kopf.
    Ich habe mehrere .mdb Datenbanken mit einer m:n-Beziehung (hoffe mal ich habe das richtig interpretiert).

    Bisher habe ich, weil ich nichts von DataSet/DataTable wusste, die Daten einfach so aus einer der Tabellen in der DB gezogen und direkt in mein DataGridView geladen.
    Bei einem Klick in eine Zelle, hat es dann alle Zelleninhalte abgerufen und mit einer anderen Tabelle verglichen und mir dann die "Connect"-Zahl(der AutoWert) ausgeworfen.
    Weil ich die Tabellen nicht dauerhaft vor mir hatte, da sich Office 97 nicht auf Windows8 installieren lassen will, habe ich irgendwie übersehen, dass die Connect-Zahl (die ich benötige) auch schon in der Haupttabelle, die angezeigt wird vorkommt. (Außerdem gibts Probleme mit doppelten Werten :/)

    Da ich jetzt zum ersten mal mit DataSet und DataTable arbeite, habe ich leichte Probleme damit zurecht zu kommen. Vernünftige Quellen, wo ich mir das anschauen kann, finde ich auch nicht :/

    Ich habe folgendes in einem neuen Projekt stehen, um es mal auszuprobieren:

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Form1
    3. Dim con As New OleDbConnection
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. con.ConnectionString =
    6. "Provider=Microsoft.Jet.OLEDB.4.0;" &
    7. "Data Source= C:\Temp\blubb.mdb;"
    8. con.Open()
    9. dgvShow()
    10. End Sub
    11. Private Sub dgvShow()
    12. Dim ds As New DataSet
    13. Dim dt As New DataTable
    14. ds.Tables.Add(dt)
    15. Dim da As New OleDbDataAdapter
    16. da = New OleDbDataAdapter("select * from Übersicht", con)
    17. da.Fill(dt)
    18. DataGridView1.DataSource = dt.DefaultView
    19. con.Close()
    20. End Sub
    21. End Class


    Probleme, die jetzt dadurch auf mich zukommen:

    1. Die Zellenüberschriften stimmen nicht mehr. Ändern durch folgendes klappt nicht mehr:

    VB.NET-Quellcode

    1. DataGridView1.Columns(4).Name = "Notizen"


    2. Spalten "ausblenden" funktioniert, indem ich den OleDBDataAdapter-String (da) "manipuliere" also statt dem Sternchen, die Spaltenüberschriften mit Komma getrennt eintrage. Geht das auch irgendwie mit Spaltenzahlen? (mal brauchts 5, mal 6 Spalten - ggf mehr)
    Wie greife ich (bei einem Zellenklick) auf die ausgeblendete Connect-Zahl zu?

    Würde mich sehr freuen, wenn mir wer helfen könnte. :saint:

    Rasalas schrieb:

    Vernünftige Quellen, wo ich mir das anschauen kann, finde ich auch nicht
    Haste das hier schon mal angeguckt?
    die relationale GrundIdee
    vier Views-Videos
    Daten laden, speichern, verarbeiten
    Datenbänkerei-Einstieg
    "Datenbank in 10 Minuten" auf Movie-Tuts

    Es ist halt eine heiß diskutierte Frage, ob man zum Beginn einer Datenbänkerei überhaupt eine DB hinzuziehen soll, oder ob man mit dem "restlichen" Stoff nicht reichlich genug zu tun hat.
    Kontroverse, ob eine DB nötig ist
    Ja - vor einiger Weile (vor 1-2 Monaten) hatte ich das alles durchgearbeitet. Aber nie selbst angewendet, bzw. umgemodelt um zu dem zu kommen was jetzt in meinem Programm drin steht.

    Da stand aber m.E. nirgends, wie man die Spaltentitel im nachhinein (klappt ja irgendwie nicht) ändert, oder man auf "ausgeblendete" Daten zugreift. Vielleicht ists aber auch wieder zu lang her - wühl ich das halt nochmal alles durch :/

    Ich schätze mal, dass das jeweils ca. 1 Zeile Code ist :/
    also wenn du das mal durchgearbeitet hattest, dann ist deinem Code zu entnehmen, dass nichts davon hängengeblieben ist.
    Übrigens diese "Connect"-Spalte scheint was ähnlich einer DataRelation zu tun zu haben, aber besser gucks dir nochmal richtig an.
    Und: dynamisch Spalten hinzufügen wollen ist zu 99% ein DesignFehler, und das letztliche % - naja - da muss man schon seehr genau wissen, was man tut...
    Das sind Datenbanken, die nicht von mir erstellt wurden und beim Nutzer irgendwo auf der Festplatte rum liegen.
    Bei einer mir vorliegenden Datenbank gibt es eine Spalte mehr als bei den anderen beiden. Deshalb wollte ich die Spaltenanzahl dynamisch hinzufügen.
    Da noch weitere Felder frei sind, schätze ich, dass da absichtlich Luft gelassen wurde, um agiler zu sein.
    Das geht nicht. Man kann keine Anwendung schreiben für ein Datenmodell, was auf verschiedenen Computern ein anneres ist.
    Da widersprechen mir sicherlich einige wirkliche DB-Profis, aber dann sollen die dir erklären, wie das gehen soll - weil das wird so aufwendig, dasses imo hier im Forum nicht mehr vermittelbar ist.

    Was du machen kannst ist, dass du für dein Datenmodell (mit der Spalte mehr) eine Anwendung schreibst, und bei den anneren Leuten bleibt die Spalte halt leer.

    Nee, geht doch nicht: Auslesen geht ja noch, aber wenn du Code schreibst, der dein Datenmodell in die DB speichert, und bei den anneren Leuten existiert die Spalte nicht - peng.

    Wie gesagt: in 1% der Fälle mag sowas sinnvoll sein, dann aber Leuten vorbehalten, die wirklich sattelfest sind.

    Also wenn das Datenmodell Spielraum hat, wäre jetzt die Zeit, das zu diskutieren, um rauszukriegen, ob das wirklich so unvermeidbar ist - ansonsten bin ich halt draußen.
    Hat schon alles seine Richtigkeit.

    Die Spaltenüberschriften stehen jeweils in einer .ini-Datei, die sich im gleichen Ordner befinden, wie auch die Datenbank selbst.
    Die Datenbanken heißen alle gleich, die Tabellen heißen alle gleich und die Spaltennamen sind alle gleich. Gewisse Spalten haben immer gleiche Daten(z.B. Seitenanzahl des jew. Datensatzes[Spalte 6("Pages")] & Notizen [Spalte 7("Note")])

    Hier dran kann man das Datenmodell vielleicht schon erkennen - vielleicht hab' ich es auch falsch benannt.
    In Field 4 und Field 5 können noch weitere Daten stehen - aber nur, wenn in der .ini auch eine weitere Spalte benannt wird.

    Übersicht

    ConnectField1Field2Field3Field4Field5PagesNote
    1Name316.12.19950151*****

    1
    2Name210.08.19910176*****

    3
    3Name426.10.19710160*****

    2

    Images
    ConnectNumberImageFile
    111
    212
    223
    234
    315
    326


    Und wie gesagt, brauche ich nur diese beiden Befehle.
    Wenn ich erst, wie ich es auch schon anders hinbekommen habe, in einer anderen Tabelle nach den Daten in der ausgewählten Zeile suchen muss, bringt mir das recht wenig. Und genau diese Art wird überall beschrieben - nur das abgreifen von nicht im DataGridView dargestellten, aber im DataTable(?) gespeicherten Daten will mir nicht vors Augenlicht treten.
    So kann man nicht übers Datenmodell reden. Weil ich hab ühaupt kein Plan, was da modelliert sein soll.

    jdfs. normal geht das nicht, dass eine Tabelle im Modell mal 4 Spalten haben soll, mal 5.
    Das ist entweder ein Datenmodell-Fehler (kann aber ohne Kenntnis der modellierten Wirklichkeit nicht beurteilt werden), oder ein extremer Sonderfall, welcher die Möglichkeiten von typisiertem Dataset oder anderen Mapping-Technologien überschreitet.

    Also ich zumindest kann dir da nicht weiterhelfen.

    Rasalas schrieb:

    nur das abgreifen von nicht im DataGridView dargestellten, aber im DataTable(?) gespeicherten Daten will mir nicht vors Augenlicht treten.
    Was erwartest du von einem solch inkonsistenten Datenmodell?
    Du musst die schrottige Dynamik mit eigener Intelligenz, die auf der DataTable aufsetzt, abbilden.
    Die Standardverfahren greifen nur, wenn tatsächlich so etwas wie ein Datenmodell da ist.

    Ich würde in deinem Fall wahrscheinlich so verfahren, dass ich in jede DB eine View einbaue, die in allen DBs gleich aussieht.
    Wo deine benötigten Spalten nicht existieren, kannst du ja Dummys anlegen oder TEMP-Tabellen verwenden.
    Dann kannst du mit deinem Programm auf diese standardisierte View zugreifen und hast wenigstens das Programm vernünftig strukturiert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    So - Videos alle nochmal angeschaut(und die Links, die fast das gleiche wiedergeben). Irgendwie habe ich immernoch das Gefühl, dass da irgendwas falsch ist.
    Das einzige was ich mir vorstellen kann ist, dass mein Programm die vorhandenen .mdb-Datenbanken, die verschickt werden können/sollen, kurzzeitig in ein typisiertes Dataset importiert wird(also eine "Kopie" der .mdb-Datenbankstruktur in VB erstellt).
    Das würde vermutlich auch die Öffnungszeiten der .mdb-Dateien vermindern und Fehler minimieren.

    War das was ihr mir hier versucht habt zu vermitteln so gemeint?
    Ich erstelle ein Dataset mit der Struktur der .mdb-Dateien, schreibe dann irgendwie die Daten der .mdb-Datei während der Laufzeit via Code in das Dataset, worauf das DataGridView dann auf die DataSource(?) zugreift und die Daten darstellt(Problem?). Wenn ich auf eine Zelle des DataGridviews klicke, hole ich den "Connect-Wert"(quasi die ID) über die BindingSource und bekomme dann irgendwie die Anzahl und "Startposition"[ImageFile] der hinterlegten Bilder heraus.
    Bei Bearbeitung der Daten exportiere ich dann die Daten aus dem Dataset in die .mdb-Datei.
    Korrekt, oder vollkommen wirrer Mist?

    An den .mdb-Dateien kann ich nichts machen, die sind so.
    naja, fängt gut an, und wird dann immer wirrer
    • Ich erstelle ein Dataset mit der Struktur der .mdb-Dateien, schreibe dann irgendwie die Daten der .mdb-Datei während der Laufzeit via Code in das Dataset - :thumbup:
    • worauf das DataGridView dann auf die DataSource(?) zugreift und die Daten darstellt(Problem?).
      - schon iwie nicht falsch. Aber auch nicht wirklich richtig :thumbdown: Also die DGVs ist via BindingSources an DataTables gebunden. Funzt vmtl. dadurch, dass das DGV intern vonne BindingSource das ListChanged-Event verarbeitet.
      Ist auch egal wies funzt - nimm einfach hin: Es ist gebunden: Ändern sich die Daten, ändert sich das DGV, ändert sich das DGV, ändern sich die Daten. Niemand holt oder bringt was, und es gibt auch kein "(Problem?)"
    • Wenn ich auf eine Zelle des DataGridviews klicke, hole ich den "Connect-Wert"(quasi die ID) über die BindingSource und bekomme dann irgendwie die Anzahl und "Startposition"[ImageFile] der hinterlegten Bilder heraus.
      - watWatWat?? Wenn du auf eine DGV-Zelle klickst, passiert gar nix. Dann passiert genau das, was du programmierst, was passieren soll. "Quasi-IDs" hamwa nich, und "irgendwie" Anzahl "Startposition" [ImageFile] - was? ?(
    Das alles schön und gut, aber löst nicht dein Problem, dass du eine Anwendung schreiben willst, bei der unbekannt ist, ob eine Spalte da ist oder nicht, und daran auch nix ändern kannst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()