Datensatz ausgeben

  • C#

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

    Datensatz ausgeben

    Moin,

    Ich kenne mich noch nicht wirklich mit Datenbanken aus..

    Wie kann ich denn nun in einer MessageBox ausgeben, ob der Username oder das Passwort falsch ist ?(

    C#-Quellcode

    1. #region Login
    2. private void Login()
    3. {
    4. string cn_string = Properties.Settings.Default.dbLoginConnectionString;
    5. SqlConnection cn = new SqlConnection(cn_string);
    6. string sql_Abfrage = "SELECT * FROM tbl_Users WHERE Benutzer= '" + TxtUser.Text + "' AND Passwort= '" + TxtPass.Text +"'";
    7. SqlDataAdapter sql_Adapter = new SqlDataAdapter(sql_Abfrage, cn);
    8. DataTable tblData = new DataTable();
    9. sql_Adapter.Fill(tblData);
    10. if (tblData.Rows.Count == 1)
    11. {
    12. FrmHauptMenü HauptMenü = new FrmHauptMenü();
    13. HauptMenü.LoginÜbertrag = TxtUser.Text;
    14. HauptMenü.Show();
    15. }
    16. else
    17. {
    18. ErrProv.SetError(TxtUser, "Incorrect username");
    19. ErrProv.SetError(TxtPass, "Incorrect password");
    20. }
    21. }
    22. #endregion
    Hast du den Code selber geschrieben? Denn wenn ja solltest du wissen an welcher stelle da es ja schon im Code steht.
    Wenn du wissen willst welches Falsch war musst du 2 Abfragen machen. Aber das ist eigentlich nicht zu empfehlen.
    Denn sonst weiß auch jeder der da per Bruteforce rangeht wann er denn einen Validen Nutzernamen gefunden hat und wann nicht.
    Desweiteren ist dein Code anfällig für SQL Injections und du solltest in deiner Anwendung keine Login Daten für deine Datenbank hinterlegen.
    Nutze dafür eine Art API die deine Anfragen behandelt und dein Programm nur User+Pass an die Api schickt und diese dir sagt ob ok oder nicht.
    Grüße , xChRoNiKx
    Erstmal Danke :)

    Hast du den Code selber geschrieben? Denn wenn ja solltest du wissen an welcher stelle da es ja schon im Code steht.


    Sagen wir mal "halben". Habe gestern so ziemlich den ganzen Tag Tutorials gelesen resp. auch Angeschaut auf YouTube.

    Die einzelnen SQL-Befehle (SELECT, INSERT, DELETE, UPDATE) habe ich anhand eines Testprogramms in einer Listbox getestet bis es funktioniert hat.

    Habe bisher noch nie mit den Klassen "SqlConnection, SqlDataAdapter, DataTable, SqlCommand" gearbeitet.


    Wenn du wissen willst welches Falsch war musst du 2 Abfragen machen. Aber das ist eigentlich nicht zu empfehlen.Denn sonst weiß auch jeder der da per Bruteforce rangeht wann er denn einen Validen Nutzernamen gefunden hat und wann nicht.Desweiteren ist dein Code anfällig für SQL Injections und du solltest in deiner Anwendung keine Login Daten für deine Datenbank hinterlegen.Nutze dafür eine Art API die deine Anfragen behandelt und dein Programm nur User+Pass an die Api schickt und diese dir sagt ob ok oder nicht.


    Ist nicht weiter schlimm. Ich bin hier alles bisschen am durchtesten/am lesen wie was genau geht.

    Will hier noch eine Art "Rechtevergabe" machen.
    Sowas:

    Benutzer: Admin = Recht 1
    Benutzer: Test = Recht 2
    Benutzer: Blub = Recht 1


    In der Hauptform wird die Rechtevergabe abgefragt aus der Datenbank (denke sowas geht im Designer mit solchen relationen, da wie oben beschrieben "Admin + Blub" das Recht 1 hat... Wie Relationen ganz genau funktionieren muss ich noch schauen ... soweit bin ich noch nicht gekommen...)

    Hat der Benutzer das Recht 1 = Kann in einem MenüStrip eine weitere Form geöffnet werden mit einem DataGridView mit allen Usern/Pws/Rechte, dort kann: Hinzugefügt, gelöscht, umbenannt werden.

    Das nächste was ich machen will ist eine Art "Telefonbuch". Benutzer mit Rechte 1 können darin:
    - Neue Einträge hinzufügen (INSERT)
    - Einträge löschen (DELETE)
    - Selektierte Einträge umbenennen (UPDATE)
    Rechte 2:
    - Nur SELECT *-Befehl um die Liste zu laden...


    Zum Programm oben wie ich das ganze verstehe:

    C#-Quellcode

    1. #region Login
    2. private void Login()
    3. {
    4. //
    5. //Zugreifen auf den Connectionstring, welcher beim Datenbankerstellen in die Settings.Settings + App.config erscheint.
    6. //
    7. string cn_string = Properties.Settings.Default.dbLoginConnectionString;
    8. SqlConnection cn = new SqlConnection(cn_string);
    9. //
    10. //Auswählen "SELECT" von der von mir erstellten Tabelle "tbl_Users" welche den User "TxtUser.Text + TxtPass.Text" enthält.
    11. //
    12. string sql_Abfrage = "SELECT * FROM tbl_Users WHERE Benutzer= '" + TxtUser.Text + "' AND Passwort= '" + TxtPass.Text +"'";
    13. //
    14. //SQLDataAdapter um die Daten abzurufen (ABFRAGE im connectionstring)
    15. //
    16. SqlDataAdapter sql_Adapter = new SqlDataAdapter(sql_Abfrage, cn);
    17. //
    18. //Der sql_Adapter füllt nun die Ergebnisse von der ABFRAGE im connectionstring in die DataTable
    19. //
    20. DataTable tblData = new DataTable();
    21. sql_Adapter.Fill(tblData);
    22. //
    23. //Ist 1 Datensatz nun in der DataTable soll der Zugriff stattfinden, sonst nicht (wäre ja dann "0")
    24. //
    25. if (tblData.Rows.Count == 1)
    26. {
    27. FrmHauptMenü HauptMenü = new FrmHauptMenü();
    28. HauptMenü.LoginÜbertrag = TxtUser.Text;
    29. HauptMenü.Show();
    30. }
    31. else
    32. {
    33. ErrProv.SetError(TxtUser, "Incorrect username");
    34. ErrProv.SetError(TxtPass, "Incorrect password");
    35. }
    36. }
    37. #endregion
    Kleiner Tipp: Ich würde mir ne separate Klasse schreiben, welche den Zugriff auf die DB macht. Dieser dann das SQL-Statement übergeben und den Rückgabewert verarbeiten.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich täte davon abraten, als Anfänger die Datenbänkerei gleich anhand einer User-Rechte-Verwaltung angehen zu wollen.
    User-Rechte-Verwaltung ist nämlich ein kniffliges Thema, und sollten nur Könner machen, weil es muss wirklich sicher sein.
    Andernfalls bastelste womöglich etwas hin, und wenns zu deiner Zufriedenheit funzt, verwendeste es späterhin - und es hat aber Sicherheitslücken ;(.

    Tatsächlich sieht man deim Code an, dass du erstmal ühaupt lernen musst, mit typisiertem Dataset effektiv umzugehen - Stichwort Databinding, Datenmodellierung.
    Bevor diese Themen nicht bewältigt sind, hats keinen Sinn, einen Db-Zugriff zu unternehmen.
    Weil diese beiden Themen diktieren eine Strategie, nach der man beim Db-Zugriff vorgehen muss, ansonsten ist das Projekt ziemlich sicher zum Scheitern verurteilt.

    Oder kurz:
    • Ohne Datenmodellierung zu beherrschen kann man ja nur eine Grütze-Db erstellen, und ein darauf aufbauendes Projekt kann nur scheitern
    • Ohne Databinding ist die Anzeige und der Daten-Abruf suboptimal, ineffizient, inkonsistent, instabil, anfällig für Angreifer, unwartbar - da kann man nur wünschen dasses scheitert, weil das ist ja auch eine Chance, es richtig zu erlernen
    Hier der Lehrplan: Datenverarbeitungs-Vorraussetzungen
    Programmiersprache der Samples ist zwar vb.net, aber die Videos und das KnowHow gilt ebenso für c#.

    Noch einmal ganz deutlich mein Rat:
    Lass zunächst die Finger vonne Db weg, und entwickel erstmal eine ganz einfache Dataset-Only databinding-getriebene relationale Datenverarbeitung - etwa ein Kassensystem für einen Blumenladen.
    Wenn das gemeistert ist, dann ist Zeit, sich damit zu beschäftigen, wie man dieser Anwendung nachträglich eine Datenbank hinterlegt.

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

    Mögliche wäre es auch, dass du die Finger von Datenbanken lässt und Objektorientiert weiter arbeitest. Als einen Object Relationship Mapper, kurz ORM, verwendest.
    Da gibt es immer noch welche bei denen du deine SQL-Statements selbst schreiben kannst oder gar musst, aber das Entity Framework, kurz EF, zum Beispiel, kann die diese Aufgabe abnehmen.
    Du schreibst Klassen und arbeitest mit den Objekten und das EF übernimmt den Teil zur Datenbank. Mit dem Database Code First Ansatz erzeugt das EF dir auch deine DB Struktur aus deinen Klassen.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Erstmal Danke für die vielzahl an Anworten :)

    mrMo schrieb:

    Kleiner Tipp: Ich würde mir ne separate Klasse schreiben, welche den Zugriff auf die DB macht. Dieser dann das SQL-Statement übergeben und den Rückgabewert verarbeiten.


    Habe das in dem Testprogramm so gemacht... Hier aber bewusst weggelassen (es handelt sich ja nur um ein Login, gibt keine weiteren Abfragen).

    ErfinderDesRades schrieb:


    Ich täte davon abraten, als Anfänger die Datenbänkerei gleich anhand einer User-Rechte-Verwaltung angehen zu wollen.
    User-Rechte-Verwaltung ist nämlich ein kniffliges Thema, und sollten nur Könner machen, weil es muss wirklich sicher sein.
    Andernfalls bastelste womöglich etwas hin, und wenns zu deiner Zufriedenheit funzt, verwendeste es späterhin - und es hat aber Sicherheitslücken ;(.


    Naja, Dachte hier kann ich ansetzen mit dem Modellieren (Mein ungefährer Gedanke):
    ID -> tbl_Users in den Designer packen:
    ID [Schlüssel] fortlaufend (Ist Identity = True)
    Benutzer: "admin", "nutzer"
    Passwort: "admin", "nutzer"

    Nun eine weitere Tabelle gestalten tbl_Rechte mit:
    ID [Schlüssel] fortlaufend
    Benutzer: "admin"
    Nutzerrecht: "1"
    Anschliessend diesen auch in den Designer packen
    Hier die Benutzer aus tbl_Users + tbl_Rechte miteinander verbinden.

    Nun mit If abfragen vorgehen ... hat der User in der Datenbank Nutzerrecht = "1" --> Zugriff gestatten.

    (Muss hier aber ehrlich sagen, dass es schon eine Weile her ist, als ich die 4view's angesehen habe... werde diese morgen nochmal studieren)


    Tatsächlich sieht man deim Code an, dass du erstmal ühaupt lernen musst, mit typisiertem Dataset effektiv umzugehen - Stichwort Databinding, Datenmodellierung.
    Bevor diese Themen nicht bewältigt sind, hats keinen Sinn, einen Db-Zugriff zu unternehmen.
    Weil diese beiden Themen diktieren eine Strategie, nach der man beim Db-Zugriff vorgehen muss, ansonsten ist das Projekt ziemlich sicher zum Scheitern verurteilt.

    Oder kurz:
    • Ohne Datenmodellierung zu beherrschen kann man ja nur eine Grütze-Db erstellen, und ein darauf aufbauendes Projekt kann nur scheitern
    • Ohne Databinding ist die Anzeige und der Daten-Abruf suboptimal, ineffizient, inkonsistent, instabil, anfällig für Angreifer, unwartbar - da kann man nur wünschen dasses scheitert, weil das ist ja auch eine Chance, es richtig zu erlerne


    Databindings sind sowas wie "Verknüpfungen", welche man bei den Steuerelementen z.B. TextBoxen auswählen kann, dass dieser Inhalt direkt angezeigt wird z.B. wenn ich Inhalte aus der Datenbank in einzelnen TextBoxen ausgeben will.. Bei DataSet's kann ich diese "Databindings" also auch einsetzen?

    Habe hierzu die 4View's von dir letztes Jahr angesehen - fand diese Super. (habe ich nicht vergessen, habe damals das Projekt aber abgebrochen, weil es mehr Zeit als Erwartet in Anspruch nimmt ;) - Nun habe ich aber Zeit :) )

    ErfinderDesRades schrieb:



    Hier der Lehrplan: Datenverarbeitungs-Vorraussetzungen
    Programmiersprache der Samples ist zwar vb.net, aber die Videos und das KnowHow gilt ebenso für c#.


    Habe ich sowieso vorgenommen zum das alles zu studieren. Werde ich morgen Nachmittag anfangen ...

    Was für mich allerdings schwierig ist:
    überall wird es ziemlich anders beschrieben:
    - Buch Programmieren mit C# 3.0 -> Die schreiben was von LINQ to SQL-Designer (mit DataContent modellieren (habe ich noch nicht angeschaut (LINQ kenne ich nicht) ist auch ein älteres Buch)
    - Buch Einstieg in Visual C# 2013 -> Die machen was mit OleDbConnection, ...
    ...


    Noch einmal ganz deutlich mein Rat:
    Lass zunächst die Finger vonne Db weg, und entwickel erstmal eine ganz einfache Dataset-Only databinding-getriebene relationale Datenverarbeitung - etwa ein Kassensystem für einen Blumenladen.
    Wenn das gemeistert ist, dann ist Zeit, sich damit zu beschäftigen, wie man dieser Anwendung nachträglich eine Datenbank hinterlegt.


    Kleine Frage:
    @msdn: ( msdn.microsoft.com/de-de/library/8bw9ksd6.aspx )
    "Datasets sind Objekte, die Datentabellen enthalten, in denen Sie die in einer Anwendung verwendeten Daten temporär speichern können. Wenn die Anwendung mit Daten arbeiten muss, können Sie die dafür erforderlichen Daten in ein Dataset laden, womit für die Anwendung ein lokaler Datencache im Arbeitsspeicher bereitgestellt wird."

    Also das heisst sowas wie "Daten in verschiedene TextBoxen schreiben, "Speichern drücken" (im Hintergrund wandert das ganze in den Cache (DataSet) - Daten aus den Textboxen (mit TxtName.Text = "";) entfernen und durch einen weiteren Button in ein "Datagridview / Listview" o.ä. reinladen. Die Daten löscht es jedoch nach dem schliessen des Programms, da diese "nur" im Cache sind?

    Was die Rechte anbelangt: Das Programm ist "nur" Intern d.H. keine wirkliche Gefahr wegen irgendwelchen Sicherheitslücken... Aber soll ja nicht jeder überall Zugriff haben.

    Was für mich noch eine wichtige Frage ist: was ist, wenn mehrere Nutzer gleichzeitig das Programm verwenden...

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „newsletter“ ()

    newsletter schrieb:

    Was für mich allerdings schwierig ist:
    überall wird es ziemlich anders beschrieben:
    - Buch Programmieren mit C# 3.0 -> Die schreiben was von LINQ to SQL-Designer (mit DataContent modellieren (habe ich noch nicht angeschaut (LINQ kenne ich nicht) ist auch ein älteres Buch)
    - Buch Einstieg in Visual C# 2013 -> Die machen was mit OleDbConnection, ...
    Ähm - lies nochmal meinen Post.
    Ich empfehle, die Finger vonne Db zu lassen! Dann bist du diese Probleme erstmal los, bis du soweit bist, dich dem zu stellen.
    Und - ja das sind genau die beiden möglichen Db-Zugriffs-Strategien (s.a. Mr.Trebrons post): Linq2Sql ist ein ORM, OleDbConnection läuft auf Datasets hinaus.
    Und du kannst noch Monate herumsuchen, und wirst immer weitere, andere, unterschiedliche Beschreibungen finden: EF-Core, EF-ModelFirst, EF-CodeFirst, typDatasets, untyp Datasets, DataReader, lokale DataTables,...

    Nocheinmal: Lass einfach die Finger von, und kümmer dich um das KnowHow, was du jetzt brauchst, und als Vorraussetzung fürs annere.