Laden...

Wie kann ich eine Datenbank in einem DataGrid anzeigen?

Erstellt von AceTecNic vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.316 Views
A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 3 Jahren
Wie kann ich eine Datenbank in einem DataGrid anzeigen?

verwendetes Datenbanksystem: <MariaDB10 [SynologyDS218+]>

Hallo zusammen.

Nachdem ich mein letztes Projekt (halbwegs) abgeschlossen habe, mach ich mich an mein nächstes langsam ran.
Ich möchte (langfristig) ein Zentrales Verwaltungssystem für meinen Betrieb basteln. Dafür habe ich mir auch schon ein vorläufiges Design erstellt. Soviel mal dazu.

Ich habe mir das ganze mal angesehen und ein wenig im Internet geschnuppert, aber eine DB lässt sich nicht vermeiden. Da ich unter anderem die NAS von Synology verwende, habe ich MariaDB hierfür gewählt.

Mein aktuelles Problem besteht beim laden der DB in ein DataGrid. Da meine Anleitung etc. dafür nicht geeignet ist, komme ich auch nach einigen Versuchen nicht weiter...

Laut der Anleitung soll ich im Aktionsfenster (rechtsunten) die Aktion "Shown" benutzen. Den gibt es aber nicht. Daher habe ich eine andere genommen, mit der es aber auch nicht ganz will.

Letztendlich kommt (bevor das 2. Fenster aufgeht) eine Fehlermeldung: Unable to connect to any of the specified MySQL hosts.
Mit einem SQL Tester kann ich aber die Verbindung aufbauen?

Eventuell hat mir ja jemand einen Hinweis woran es liegen könnte.

Vielen Dank für eure Mithilfe!!!!

EDIT: Ich habe die Fehlermeldung mittlerweile wegbekommen. Window_Loaded war das richtige. Allerdings habe ich noch keinen Inhalt aus der DB?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using MySql.Data;
using MySql.Data.MySqlClient;
using MySql.Web;
using System.Data;
using System.Data.Common;

namespace SCM
{



    /// <summary>
    /// Interaktionslogik für Auftragsverwaltung.xaml
    /// </summary>
    public partial class Auftragsverwaltung : Window
    {
            MySqlConnection connection = new MySqlConnection();
            private string db_server = "192.168.0.77";
            private string db_user = "root";
            private string db_password = "PRIVATE";
            private string db_name = "SCMDATA";
            private string db_port = "3307";


        public Auftragsverwaltung()
        {
            InitializeComponent();
            connection.ConnectionString = "Server=" +db_server + "; Database=" +db_name + "; Uid=" +db_user + "; Pwd=" +db_password + "; Port=" +db_port + ";";
        }

        private void ZurückMainWindow(object sender, RoutedEventArgs e)
        {
            MainWindow mainWindow = new MainWindow();
            this.Close();
            mainWindow.Show();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                connection.Open();
            }
            catch (MySqlException exc)
            {
                MessageBox.Show(exc.Message, "Datenbankfehler", MessageBoxButton.OK);
                this.Close();

            }



        }

        public DataTable DatenVonTabelle(string Tabelle, string Filter = "")
        {
            DataTable dt = new DataTable();
            try
            {
                if (connection.State != ConnectionState.Open)
                    connection.Open();
                DGAuftrag.DataContext = DatenVonTabelle("Mitarbeiter");
                String abfrage = "SELECT* FROM " +Tabelle + (Filter == "" ? String.Empty : " WHERE " +Filter);
                MySqlDataAdapter msda = new MySqlDataAdapter(abfrage, connection);
                msda.Fill(dt);
                connection.Close();
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.Message, "Datenbankfehler", MessageBoxButton.OK);
                if (connection.State == ConnectionState.Open) connection.Close();
            }
            return dt;
        }




    }
}


4.931 Beiträge seit 2008
vor 3 Jahren

Da hast du vermutlich einen Logikfehler bzgl. deiner Fenster (Windows) - Kommunikation drin.

Wer ruft denn DatenVonTabelle auf? Und was soll der rekursive Aufruf dadrin

DGAuftrag.DataContext = DatenVonTabelle("Mitarbeiter");

?

Und deine Methode ZurückMainWindow erzeugt ein neues MainWindow-Objekt (anstatt zum aufrufenden MainWindow-Objekt zurückzukehren)!

Du wirst aber nicht darum herum kommen (bzgl. "Zentrales Verwaltungssystem für meinen Betrieb"), dich mit den wichtigsten Architektur- und Designprinzipien vertraut zu machen:
[Artikel] Drei-Schichten-Architektur
[Artikel] MVVM und DataBinding

Und bzgl. Datenbankabfragen auch [Artikelserie] SQL: Parameter von Befehlen.

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 3 Jahren

Wer ruft denn DatenVonTabelle auf? Und was soll der rekursive Aufruf dadrin

Das sollte aufgerufen werden, sobald Window_Loaded

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                connection.Open();
///dgvCocktails.DataSource = DatenVonTabelle(„Cocktails“); !--Aus dem Tutorial
///DGMitarbeiter.DataSource = DatenVonTabelle("Mitarbeiter");   !--DataSource steht nicht zur Auswahl
             }
            catch (MySqlException exc)
            {
                MessageBox.Show(exc.Message, "Datenbankfehler", MessageBoxButton.OK);
                this.Close();

            }
        }

Und deine Methode ZurückMainWindow erzeugt ein neues MainWindow-Objekt (anstatt zum aufrufenden MainWindow-Objekt zurückzukehren)!

Ist das Falsch? Bzw. nicht ganz Richtig? Beim drücken des Auftragsfensters wird das MainWindow geschlossen und das Auftrags (Mitarbeiter) Fenster geöffnet. Zurück das selbe.

Das mit der Dreischichten-Architektur hatte ich mal angeschnitten, denke das kommt noch so nach und nach. 🤔

Danke für deine Nachricht.

16.806 Beiträge seit 2008
vor 3 Jahren

Im Endeffekt ist die Basis falsch, ja.

WPF ist darauf ausgelegt, dass Du mit dem MVVM Pattern arbeitest, was Du leider nicht tust.
Daher stimmt die Grundfunktionalität nicht, wie Du die Sache angehst. Es wird Dir leider nicht helfen, das nach und nach zu machen, weil das der Grundbaustein Deiner Anwendung ist, den Du nicht "einfach mal so" ersetzen wirst.

Du solltest das so machen, wie es in WPF eben vorgesehen ist; sonst wirst Du ständig stolpern und Dir Workaround um Workaround bauen.

Ist das Falsch? Bzw. nicht ganz Richtig?

Normalerweise würde man ein Fenster verstecken und nicht zerstören.

4.931 Beiträge seit 2008
vor 3 Jahren

///dgvCocktails.DataSource = DatenVonTabelle(„Cocktails“); !--Aus dem Tutorial
///DGMitarbeiter.DataSource = DatenVonTabelle("Mitarbeiter");   !--DataSource steht nicht zur Auswahl

Du hast dies aus einem Tutorial für Windows Forms (WinForms). Beim WPF-DataGrid heißt die Eigenschaft ItemsSource, s.a. DataGrid in WPF sowie WPF DataGrid Examples.

Ist das Falsch? Bzw. nicht ganz Richtig? Beim drücken des Auftragsfensters wird das MainWindow geschlossen und das Auftrags (Mitarbeiter) Fenster geöffnet. Zurück das selbe.

Du verlierst aber jegliche Daten beim Schließen des Hauptfensters (außerdem sollte sich dann auch das ganze Programm schließen - oder hast du es nur versteckt?).
Generell sollte aber ein untergeordnetes Fenster niemals Zugriff auf das übergeordnete Fenster haben (Stichwort: Wiederverwend- und Wartbarkeit), s.a. [FAQ] Kommunikation von 2 Forms bzw. meinen eigenen Artikel dazu Kommunikation von 2 Forms.

Warum öffnest du das 2. Fenster denn nicht einfach (ersteinmal) modal (Window.ShowDialog())?

Noch besser wäre es, wenn du einfach nur den Inhalt des Fensters austauschst ("Page Navigation"), s.a. Wie implementiere ich einen Zurück-Button in einer App-Navigation mit MVVM? und Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen?.

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor 3 Jahren

Danke für eure Hilfe!

@Abt
Mir war wohl nicht bewusst, dass der Unterschied zwischen WFA und WPF doch so groß ist...

Bevor ich an hier groß weiter "bastel" (mit programmieren hat das nichts zu tun 😦), lese ich mich zuerst einmal in die MVVM Geschichte ein. Anschließend probiere ich mich an einem DataTable und nicht wieder alle auf einmal.

@Th69
Ich hatte es anfangs versteckt mit Window.hidden, allerdings habe ich (fällt mir eben auf) das versteckte Fenster nicht mehr Sichtbar gemacht sondern neu aufgerufen. Dadurch war ein Fenster immer im Hintergrund und noch Aktiv. Deshalb habe ich meine alte Methode angewand...
Danke.

Ich kümmere mich vorerst um ein paar grundliegende Sachen und versuche es nochmal.
Der Beitrag kann fürs erste als Erledigt angesehen werden.

Danke für euren Beistand! 🙂

16.806 Beiträge seit 2008
vor 3 Jahren

Mir war wohl nicht bewusst, dass der Unterschied zwischen WFA und WPF doch so groß ist...

Data Binding und Patterns gibt es in Forms genauso; vor allem der MVP Pattern ist hier weit verbreitet.
Du wirst bei Forms aber nicht wirklich zur Anwendung eines Binding Patterns "gezwungen", obwohl ein solcher Pattern natürlich immer zu empfehlen ist und das Leben eines Forms Entwicklers leichter macht und die Code Qualität erhöht.
Bei WPF rächt sich das hingegen sehr schnell.

MVVM ist mittlerweile der mit Abstand am meisten verbreitete Pattern in der UI Welt (nicht nur im .NET Ökosystem).