Laden...

in WinForms in ListView Daten aus mehrere Tabellen ausgeben (Access DB)

Erstellt von Feowlyn vor 2 Monaten Letzter Beitrag vor 2 Monaten 202 Views
Feowlyn Themenstarter:in
2 Beiträge seit 2023
vor 2 Monaten
in WinForms in ListView Daten aus mehrere Tabellen ausgeben (Access DB)

Verwendetes Datenbanksystem: Microsoft Access

Hallo Leute,

ich könnte etwas Hilfe gebrauchen. Ich habe einen WinForms GUI mit ListView. Dort möchte ich dann anhand SQL-Abfrage ermittelte, auf bestimmte Bedingung geprüfte Daten für User zur Auswahl darbieten. Benutzer sollte durch checkBox Auswahl zwischen verschiedene Datenstände "filtern" können.

Abfrage und ClickEvent funktioniert, wenn ich Daten aus eine Tabelle abfrage. Sobald ich sie aber mittels JOIN auf Bedingung aus andere Tabelle abfragen möchte, bekomme ich Error(mittlerweile behoben - es lag an einer "reservierten Wort" - dieser Spaltenname ist nun in eckigen Klammern, und stört nicht mehr).

Allerdings bleibt ListView leer. Meine Frage ist (da Infos zu genau solchen Fall sehr unterschiedlich und teils verwirrend sind - erst recht Microsoft Seiten - so Profi bin ich lange noch nicht), Brauche ich da einen oder 2 DataAdapter? Habe ich es richtig verstanden, dass ich 2 DataTables in meinen DataSet packen soll? Laut andere Quellen brauche ich sogar DataRelation. In mein Access Datenbankschema sind die 2 Tabellen über eine Zwischentabelle gebunden um "n zu m" Beziehung zwischen 2 Tabellen zu lösen.

Meine ListView ist auf GUI leeres Element und ich fülle es in Code über ClickEvent mit Spalten und Zeilen, sowie mit Daten. Ich habe es nicht über Forms(Entwurd) gemacht, da ich Spalten nicht vordefiniert brauchte.

Dafür mache ich pro "Filteroption" von CheckBox eine Methode. Den Code darin fange ich in try-catch.

Ich mache mit using-Direktive eine OleDbConnection und eine OleDbAdapter, mache dann meine DataSet, fülle es mit adapter Hilfe, setze meine ListView auf Details, adde Spalten und mit foreach (für Zeilen als Subitems) die Zeilen mit .ToString() am Ende. 
Danach rufe ich diese Methode in dementsprechenden ClickEvent auf.

Leider bin ich immer noch verwirrt mit DataSet und DataTables (nach mehrere Tagen mit Microsoft Seiten- zudem meist Beispiele in DataGridView sind oder dynamisch Spalten erstellen o.ä.).

Mit eine Tabelle und DataSet klappte es super, wie gesagt. Aber ich vermute ich brauche nun zusätzlich dataTables um meine Tabellen darzustellen? Mich verwirrt auch noch, dass adapter nimmt ja 2 Parameter (dataset und "tabellenname" - ist dieser Tabellenname selbst zu geben oder muss es mit Datenbank übereinstimmen? Wenn ich nur Daten aus Tabelle 1 ausgeben will, dennoch die aber mit in Tabelle 3 zu findenden Bedingung abgeglichen werden muss, welche Tabelle gebe ich dann an?

Grunde genommen möchte ich ja sozusagen folgendes erreichen mit SQL-Abfrage:

"zeige mir a,b,c,d,e (aus Tabelle1) wo bedingung ist "GHI" (String-Wert aus Tabelle 3). Und das in listView so ausgeben.

Ich hoffe sehr ihr habt Geduld und Verständnis mit mir, da es ist sehr kompliziert zu Fragen/erklären. Habt ihr eventuell ein Beispiel? (gerne werde ich auch weitere Fragen beantworten, damit wir eine Lösung finden).

Liebe Grüße und Danke im voraus. Und allen eine erholsame Wochenende, bis nächsten Freitag werde ich meine Anwendung auf der Reihe bekommen 😉

E.

4.919 Beiträge seit 2008
vor 2 Monaten

Hallo und willkommen,

Zitat von Feowlyn

...

Ich mache mit using-Direktive eine OleDbConnection und eine OleDbAdapter, mache dann meine DataSet, fülle es mit adapter Hilfe, setze meine ListView auf Details, adde Spalten und mit foreach (für Zeilen als Subitems) die Zeilen mit .ToString() am Ende.

Zeige mal den Code (inkl. SQL-Anweisung) dazu.

Generell sollte nur für das Auslesen ein SQL-JOIN auch mit nur einer DataTable funktionieren. DataRelation zwischen verschiedenen DataTable-Objekten bracht man nur, wenn man die Daten in separaten Tabellen im Speicher halten möchte und direkte Änderungen dazu dann auch wieder in der Datenbank abspeichern möchte (das geht bei SQL-JOIN-Anweisungen eben nicht).

PS: Deine Beschreibung liest sich auch so, als ob der gesamte Datenbankcode bei dir in einer Methode deiner Form-Klasse ist?! Dann lies mal [Artikel] Drei-Schichten-Architektur

Und um Fehler zu Laufzeit finden, solltest du dich mit dem Debugger vertraut machen: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Edit:

Und für das Befüllen und Anzeigen aus Datenbank-Abfragen ist auch ein DataGridView besser geeignet (Stichwort: Datenbindung [engl. Data Binding]), s.a. Vergleich DataGridView - ListView.

Feowlyn Themenstarter:in
2 Beiträge seit 2023
vor 2 Monaten

Danke für eine zügige Antwort Th69.

Somit wäre DataRelation nur für UPDATE, DELETE und INSERT INTO beinhaltende Methoden?

Das hat mir schon mal sehr viel geholfen. Man wird halt mit Informationen von vorn bis hinten überladen, viele davon sind aber nicht passend oder geeignet.

Code zeigen wird schwierig. Hab ich nicht bei mir, und musste einiges ausblenden 😉

3-Schichten Architektur habe ich schon gelesen. Inklusive Diskussionen dass MVVM nicht für WinForm geeignet ist, oder dass man in Forms.cs schreiben soll/ eben nicht schreiben darf.

Danke dennoch für den Tipp! Meine Anwendung steckt noch in Kinderschuhen.

Meine Form hat aktuell mehrere Methoden für mehrere checkboxen. Erst möchte ich herausfinden, wie ich es funktionieren bekomme. Als Mock sozusagen. Mit Beispieldaten aus Testdatenbank. präzise Aufteilung in 3 Schichten kommt noch, wenn ich richtig damit los lege. Funktionierendes GUI soll mir erstmal zeigen ob Optik und Funktionalität so sind wie ich sie brauche/ vorstelle. Man kann ja immer kompakter und verkapselter schreiben, mehr Klassen und hilfsmethoden erstellen und in Ordnern unterteilen.  Das kommt aber mit fortschreitende Erfahrung und Übung. In Theorie ist es immer viel einfacher als im Praxis, vorallem wenn keiner da ist wer einen zeigt, wie man etwas umsetzen kann, und man nur recherchiert, Bücher liest("Datenbankprogrammierung in Visual C# 2012")  und ausprobiert.

Erste Teil meines Frages hast Du damit sehr gut beantwortet. Magst Du noch mal über letzte Hälfte scrollen, auch wenn es lang war? Ich schätze Deine Zeit und Hilfe.

LG aus Kölner KVB

E.

EDIT:  Ich habe mich absichtlich gegen DataGridView entschieden. Zu DataGridView hab ich auch fünf Billion Antworten und Beiträge gesehen. Alle sagen mir mach doch WPF und mit Nicht Access und MIT DataGridView.

4.919 Beiträge seit 2008
vor 2 Monaten

Ohne Code ist es aber schwierig dir zu helfen. 😉

Zitat von Feowlyn

Erste Teil meines Frages hast Du damit sehr gut beantwortet. Magst Du noch mal über letzte Hälfte scrollen, auch wenn es lang war?

Meinst du noch diese Frage?

Mich verwirrt auch noch, dass adapter nimmt ja 2 Parameter (dataset und "tabellenname" - ist dieser Tabellenname selbst zu geben oder muss es mit Datenbank übereinstimmen?

Du meinst die untere der beiden Überladungen von OleDbDataAdapter.Fill?

tblSource ist dann der Name der DataTable im übergebenen DataSet(dieser sollte dann auch mit dem echten Datenbanknamen übereinstimmen).

Kannst du wenigstens die SQL-Abfrage zeigen?

PS: Access und OLE sind für professionelle Anwendungen auch nicht zu empfehlen. Besser sind echte Datenbanksysteme (wie MS SQL Server, MySQL, Oracle) oder aber lokale (embedded) Datenbanken (wie SQLite). Daher ist die gelesene Empfehlung weniger gegen das DataGridView, sondern gegen Access (bei WPF hättest du ja denselben Datenzugriffscode).