Laden...

Wie kann ich im WPF mich an einer Datenbank einloggen und die Daten anzeigen?

Erstellt von DerMax vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.617 Views
D
DerMax Themenstarter:in
7 Beiträge seit 2020
vor 3 Jahren
Wie kann ich im WPF mich an einer Datenbank einloggen und die Daten anzeigen?

Hallo Community,

ich bin neu hier und in der Welt des Programmierens (bin noch am Lernen) und möchte am besten mit einer bzw. gleich zwei doofen Fragen beginnen. Hoffe ich bin hier richtig...

Ich arbeite mit Visual Studio 2019 (WPF) und Microsoft SQL Server Express und möchte ein Haushaltsbuch programmieren.

Frage 1 (Userabfrage für Login):
wie bewerkstellige ich am Besten den Login?
Ich habe schon viel ausprobiert, gelesen und Videos geschaut, nur bekomme ich es nicht hin, das mehrere User in der Datenbank überprüft werden. Leider gibt es da keine Schrittweise Lösung meines Problems. Oder ich bin zu doof zum suchen...
Für meinen Test habe ich zwei verschiedene User:
User1 - Benutzername: admin - Passwort: admin
User2 - Benutzername: user - Passwort: user
User1 kann sich prima anmelden, User2 bekommt ne Exception...
Ich möchte einfach eine beliebig erweiterbare und anpassbare (hinzufügen, bearbeiten, löschen durch ein extra Fenster) Datenbank mit verschiedenen Usern nutzen

Frage 2 (Werte (dauerhaft) anzeigen lassen, hinzufügen und bearbeiten durch extra Fenster):
Für die einzelnen Einnahmen und Ausgaben möchte ich im Programm 2 DataGrids(?) einbinden, in denen die Beträge unter den folgenden Spalten stehen:
Datum - Name - Betrag - Gruppe - Kommentar
Die einzelnen Einnahmen und Ausgaben möchte ich (auch wieder bearbeitbar) in einer Datenbank stehen haben und die Werte über eine weiteres Fenster hinzufügen, editieren und entfernen können
Auch hier finde ich wiederum keine Lösung für mein konkretes Problem.

Ich hoffe Ihr könnt mir helfen, denn ich weiß einfach nicht weiter und ob Ihr es mir glaubt oder nicht, ich frage äußerst ungern nach, denn ich möchte am Liebsten alles selber schaffen. Hier komme ich nur nicht weiter X( .

1000 Dank im Vorraus und Grüße

DerMax

verwendetes Datenbanksystem: <Microsoft SQL Server Express>

P
441 Beiträge seit 2014
vor 3 Jahren

Hallo DerMax,

die Frage ist, was genau du erreichen möchtest.
In der Regel (Ausnahmen wären z.B. Datenbank Administrationstools wie z.B. SQL Server Management Studio) verbindet man eine Client Applikation niemals direkt mit der Datenbank, sondern setzt einen Abstraktionslayer (idr eine WebAPI) dazwischen.
Für die WebApi gibt es gängige Authentifizierungsmethoden, die dir dann diese Arbeit abnehmen.

Edit als Hintergrundinfo:
Das ganze macht man aus Sicherheitsgründen:
*damit niemand die direkten Datenbankzugangsdaten kennt/kennen muss *damit man genau kontrollieren kann, was auf der Datenbank passiert *damit die Datenbank nicht öffentlich erreichbar sein muss *damit man die etablierten Sicherheitsmechanismen, die auf dem http Protokoll aufbauen nutzen kann

D
DerMax Themenstarter:in
7 Beiträge seit 2020
vor 3 Jahren

Hallo Papst,

wow, schnelle Antwort 😁

  1. Fehler von mir:
    ich nutze das Microsoft SQL Server Management Studio und möchte eben aus meiner Anwendung auf die 3 Datenbanken zugreifen (User - Einnahmen - Ausgaben).
    Diese möchte ich auch wiederum aus der Anwendung erweitern können.

Meine Idee:

Fenster 1: Login (nicht direkt in der Datenbank sondern im Haushaltsbuch. Das Haushaltsbuch soll sich dann die Datenbank des angemeldeten Nutzers holen)
mehrere Nutzer sollen sich anmelden können und das Programm soll mit Ihrer eigenen Datenbank starten können
(ich als Admin, meine Eltern und meine Schwester als User)

Fenster 2: Haushaltsbuch
DataGrid Einnahmen und DataGrid Ausgaben werden angezeigt jedes Grid hat ein Button
Einnahme hinzufügen/bearbeiten - Ausgabe hinzufügen/bearbeiten

Fenster 3: Neue Einnahme
Hier möchte ich eine Einnahme hinzufügen/bearbeiten können

Fenster 4: Neue Ausgabe
Hier möchte ich eine Ausgabe hinzufügen/bearbeiten können

Fenster 5: Nutzer
Hier möchte ich User hinzufügen/bearbeiten/entfernen können

Quasi dachte ich daran, aus jedem Fenster die Datenbanken anzusprechen und nutzen zu können...

Grüße
DerMax

P
441 Beiträge seit 2014
vor 3 Jahren

Hi,

schau nochmal, was ich geschrieben habe 😃

In der Regel [...] verbindet man eine Client Applikation niemals direkt mit der Datenbank, sondern setzt einen Abstraktionslayer (idr eine WebAPI) dazwischen.

und nur der Vollständigkeit halber ist eine WebAPI nicht der Weisheit letzter Schluss, es gibt hierfür auch andere Technologien, wie z.B. gRPC

16.806 Beiträge seit 2008
vor 3 Jahren

ich nutze das Microsoft SQL Server Management Studio und möchte eben aus meiner Anwendung auf die 3 Datenbanken zugreifen (User - Einnahmen - Ausgaben).

Du meinst 3 Tabellen, oder?. Tabellen und Datenbanken sind zwei verschiedene paar Stifel.

Diese möchte ich auch wiederum aus der Anwendung erweitern können.

Du willst Daten hinzufügen oder das Schema erweitern?
Unklar ausgedrückt.

Quasi dachte ich daran, aus jedem Fenster die Datenbanken anzusprechen und nutzen zu

UI und Datenhaltung haben nichts miteinander zutun.
Siehe auch [Artikel] Drei-Schichten-Architektur

Du solltest nicht direkt aus der UI auf die Datenbank zugreifen.
Ist in 99% der Fälle ein klassischer Software Design Fehler.

Papst hat Dir aber schon das absolut richtige gesagt: abstrahier den Datenzugriff über einen Service.
Du hast keine Chance ohne Service zB ein ordentliches Rechte-Management zu implementieren.

Und ob die Daten dann von direkt von einem Datenbank-Provider oder von einem Service kommen, das muss Deiner UI völlig egal sein (siehe Schichten Artikel).

D
DerMax Themenstarter:in
7 Beiträge seit 2020
vor 3 Jahren

Hallo Abt,

  • Richtig, ich meinte Tabellen. Bin schon selber verwirrt 🤔

  • ich will lediglich Daten (User und Passwörter für User bzw. Positionen im Buch) hinzufügen, das Schema muss nicht mit weiteren Spalten bzw. Tabellen erweitert werden

  • ich werde mich dann mal die Tage schlau lesen. Vielen Dank für den Artikel.

Hatte es generell so versucht:

Benutzer anlegen (konnte neue User mit Passwort in der DB speichern, das hat also geklappt):

private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            string name = txtName.Text;
            string password = pwbPassword.Password;
            if (pwbPassword.Password.Length == 0)
            {
                errormessage.Text = "Bitte Passwort eingeben";
                pwbPassword.Focus();
            }
            else if (pwbPasswordConfirm.Password.Length == 0)
            {
                errormessage.Text = "Bitte Passwort bestätigen.";
                pwbPasswordConfirm.Focus();
            }
            else if (pwbPassword.Password != pwbPasswordConfirm.Password)
            {
                errormessage.Text = "Passwort stimmt nicht überein.";
                pwbPasswordConfirm.Focus();
            }
            else
            {
                errormessage.Text = "";
                SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=LoginTest;Integrated Security=True");
                con.Open();
                SqlCommand cmd = new SqlCommand("Insert into userLogin (username,password) values('" + name + "','" + password + "')", con);
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
                con.Close();
                errormessage.Text = "Benutzer erfolgreich angelegt.";
                Reset();
            }
        }


Einloggen hat leider nicht funktioniert, gab beim Adapter ne Exception...:
private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            if (txtUser.Text.Length == 0)
            {
                errormessage.Text = "Benutzername eingeben!";
                txtUser.Focus();
            }
            else
            {
                string username = txtUser.Text;
                string password = pwbPassword.Password;
                SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=LoginTest;Integrated Security=True");
                con.Open();
                SqlCommand cmd = new SqlCommand("Select * from loginUser where username = '" + username + "' and password = '" + password + "'", con);
                cmd.CommandType = CommandType.Text;
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = cmd;
                DataSet dataSet = new DataSet();
                adapter.Fill(dataSet);
                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    string user = dataSet.Tables[0].Rows[0]["username"].ToString();
                    programm.Begrüßung.Text = user;
                    programm.Show();
                    Close();
                }
                else
                {
                    errormessage.Text = "Benutzername und/oder Passwort falsch.";
                }
                con.Close();
            }
        }

Ich werde mich dann die nächsten Tage mal schlau lesen wegen der WebAPI.

Danke euch beiden erstmal für die Hilfe
Gruß
DerMax

16.806 Beiträge seit 2008
vor 3 Jahren

Ja, den Code kannst so eigentlich wegwerfen 😃
Aber das is nicht schlimm: das ist manchmal so.
Jeder von uns wirft Code weg.

Dein Code zeigt riesige Lücken:

  • Man speichert kein Passwort im Klartext (ist sogar gesetzlich verboten, haftest Du)
  • Man entwickelt wenn möglich keine Authentifizierung selbst (dafür gibts Frameworks!)
  • Dein Code ist voll von SQL Injection [Artikelserie] SQL: Parameter von Befehlen

Ganz ehrlich: les Dich erstmal in die Themen ein, mach Tutorials.
Das Risiko, dass Du Dich derzeit etwas aufgrund des Kenntnisstands übernimmst, ist relativ hoch.
Daher back erstmal kleine Brötchen, bevor Du an zu vielen Ecken gleichzeitig irgendwas halb lernst 😉

Des weiteren sind DataTables ganz arg alte Kiste 😉

D
DerMax Themenstarter:in
7 Beiträge seit 2020
vor 3 Jahren

Hallo Abt,

ok, ich mach mich dann mal schlau(er). Hast du vielleicht ein oder zwei gute Tutorials? Die, die ich kenne und gefunden habe sind auch schon ganz alte Kisten... 🙂

Irgendwie hab ich den Login Vorgang hinbekommen, nur wird lediglich der erste User in der Tabelle genutzt, beim Zweiten funktioniert das nicht... also Funktionsstand gleich Null 🤔

Gruß
DerMax