Laden...

Daten aus einer DB Vergleichen access 2007 C#

Erstellt von sires14 vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.162 Views
S
sires14 Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren
Daten aus einer DB Vergleichen access 2007 C#

verwendetes Datenbanksystem: <Access>

Hallo. Ich hab ein kleines Projekt und möchte dafür einen Login bauen.

Und zwar soll der Benutzer über eine Winforms seinen Benutzernamen und sein Passwort eingeben.

Daraufhin soll das Programm schauen ob der jeweilige benutzer in der datenbank vorhanden ist.

Habe jett schon soweit alles das der Name und das Passwort in der Db hinterlegbar sind und/oder der benutzer sich einloggen kann bzw letzteres klappt noch nicht so ganz.

Bis jetzt klappt das sich der benutzer mit dem mit seinem namen anmeldet und das Programm die Datenbank nach diesem benutzer dursucht.

Dann will ich das er mir die ID (primary key) zurückgibt und ich mit dieser dann sage das das Programm wieder die datenbank durchläuft bis zu diesem Primary Key und schaut ob das PW übereinstimmt mit dem eingegeben PW.

Jetzt Hab ich das Prblem das er mir die Primary keys ausliest und auch sagt das er zb. den Namen in Zeile 2 und 3 der DB gefunden hat.
Aber er will irgendwie nicht in die While gehen in der er überprüfen soll ob das passwort was in der gefunden Primarkey zeile ist, übereinstimmt mit der Eingabe des Users

Mein Code sieht wie folgt aus



 int primary_key = 0;
        string Passwortchecker = "DefaultPasswortcheck"; // globale Variablen

 #region Primary Key auslesen
            OleDbConnection abfragecheck = new OleDbConnection();            
            abfragecheck.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data Source = C:\Datenbankordner\MitarbeiterDatenbank.accdb";
            string Name_PW_Richtig = "SELECT ID FROM Mitarbeiter WHERE Username = '"+this.benutzername_speichern+"'";
            OleDbCommand Username_abgleich = new OleDbCommand(Name_PW_Richtig, abfragecheck);
            
            try
            {
                abfragecheck.Open();

                OleDbDataReader Lesen_des_namens = Username_abgleich.ExecuteReader();
                while (Lesen_des_namens.Read())

                {
                    //MessageBox.Show(Lesen_des_namens["ID"].ToString());
                    primary_key = Convert.ToInt32(Lesen_des_namens["ID"]);
                    MessageBox.Show(" Primary key in try gefunden =" + primary_key); // test ob Primary key gefunden wird
                    primary_key = Convert.ToInt32(primary_key);
                    
                    OleDbConnection Passwort_Con = new OleDbConnection();
                    Passwort_Con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data Source = C:\Datenbankordner\MitarbeiterDatenbank.accdb";
                    string Passwort_SQL =
                        "SELECT Passwort"+
                        "FROM Mitarbeiter "+
                        "WHERE ID = '" + this.primary_key + "'"+ 
                        "AND Passwort = '" + this.passwort_speichern + "'"; // vergleiche ob das passwort zur vorher gefundenen ID passt
                        OleDbCommand Passwort_abgleich = new OleDbCommand(Passwort_SQL, Passwort_Con);

                    try
                    {
                        Passwort_Con.Open();
                       
                        OleDbDataReader Lesen_des_PW = Passwort_abgleich.ExecuteReader();

                        while (Lesen_des_PW.Read())
                        {
                            MessageBox.Show("in While" + Lesen_des_PW["Passwort"].ToString());
                            Passwortchecker = Lesen_des_PW["Passwort"].ToString();
                        }

                    }
                    catch (Exception)
                    {

                        MessageBox.Show("ex unten" + Passwortchecker);
                    }

                    finally

                    { Passwort_Con.Close();}

                    

                }

                 Lesen_des_namens.Close();
               
            }
            catch (Exception)
            {

                MessageBox.Show("test+ Catch+ Primary key zum Usernamen raussuchen = "+primary_key); // test
            }


            finally
            { 
                abfragecheck.Close();
                
               
            
            }


            #endregion


bin froh das ich das mit dem reader einigermaßen hinbekommen abe ... da ich gerade erst am anfang des Programmierens stehe ..... deswegen bitte ich euch .... geht nicht zu hart mit mir ins gericht und scmeißt meinen Code nicht ganz so über den haufen 😃

Freue mich über jede antwort 😄

gruss sires

S
10 Beiträge seit 2012
vor 11 Jahren

Warum suchst du nicht mit dem eingegebenen Benutzernamen in der Mitarbeiter-Tabelle und vergleichst das Kennwort aus dem ggf. gefundenen Datensatz mit dem eingegebenen Kennwort?

(SELECT Passwort FROM Mitarbeiter WHERE Username = <eingegebener Benutzername>)

Die ID brauchst du für diese Abfrage doch offensichtlich garnicht.

Wenn allerdings der Benutzername in der Mitarbeiter-Tabelle nicht eindeutig ist, bekommst du ganz andere Probleme.

Grüße,

Christoph

F
10.010 Beiträge seit 2004
vor 11 Jahren

Ganz abgesehen davon das man niemals Passwörter in eine DB schreibt ist die ganze Herangehensweise sehr suboptimal.

Schon das Stringgefrickel macht man nicht [Artikelserie] SQL: Parameter von Befehlen

Und wie sklopskoff schon sagte, gleich nach Name und PasswordHash abzufragen ist ein 3 Zeiler.

S
sires14 Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren

Warum suchst du nicht mit dem eingegebenen Benutzernamen in der Mitarbeiter-Tabelle und vergleichst das Kennwort aus dem ggf. gefundenen Datensatz mit dem eingegebenen Kennwort?

(SELECT Passwort FROM Mitarbeiter WHERE Username = <eingegebener Benutzername>)

Die ID brauchst du für diese Abfrage doch offensichtlich garnicht.

Wenn allerdings der Benutzername in der Mitarbeiter-Tabelle nicht eindeutig ist, bekommst du ganz andere Probleme.

Grüße,

Christoph

Danke für die Antworten.

Also die ID abfrage brauch ich schon da es möglich ist den selben Benutzernamen öfters zu verwenden.

Da das ganze jetzt keine Geheimen Daten speichert sondern nur für mich bei WM-Wettspiel als login fungieren soll ist es nicht weiter tragisch wenn es deshalb offensichtlich in einer freizugänglichen Datenbank auf meinem pc gespeichert wird.

bei mir hat es soweit funktioniert das er mir den namen rausgesucht hat.
Als beispiel

id 1 name: sires passwort:123
id 2 name: sires passwort 234

jetzt hat er herausgefunden das es den namen in der ID 1 und 2 gibt aber er hat mir nicht das eingegebene passwort verglichen.
Ihr müsst euch vorstellen das this.Passwort ist die eingabe.
jetzt soll er halt schauen welche id mit dem benutzername übereinstimmt und dann vergleich ob das PW dazu stimmt wenn nicht .... soll er weiter die benutzernamen durchsuchen und mir dann wieder die id rausgeben und dann diese id vergleichen ob dabei das passwort stimmt.
vom beispiel oben.

ich hatte es mir sogedacht das er nach dem namen schaut und mir die id gibt .... dann übergebe ich die id an das neue sql statement und er soll dann vergleichen ob das dazu eingegeben PW passt .... wenn nicht soll er den nächsten namen suchen der auf die eingabe passt ... mir davon die id geben und danach wieder vergleichen ob das passwort dazu passt.

Problem ist das er mir immer nur den default-wert des pw strings "passwortchecker" gibt .... also anscheinend geht er garnicht auf die suche nach dem PW ......

T
156 Beiträge seit 2012
vor 11 Jahren

Hallo sires14,

ich würde Dir zu einer Vorgehensweise mit der ExecuteScalar-Methode raten.
Die ExecuteScalar-Methode liefert Dir genau einen Wert zurück. Wenn Du Dir die ID zurückgeben läßt kannst Du mit DbNull prüfen ob Du eine ID zurück bekommen hast.

Dein Code würde sich an dieser Stelle auf wenige Zeilen reduzieren.

Gruß, Karl

S
10 Beiträge seit 2012
vor 11 Jahren

Erweitere die Select-Abfrage:

SELECT * FROM Mitarbeiter WHERE Username = <eingegebener Benutzername> AND passwort = <eingegebenes Passwort>

Wenn kein Satz gefunden wird, ist die Anmeldung falsch.

Wenn ein Satz gefunden wird, ist die Anmeldung richtig.

Wenn mehr als ein Satz gefunden wird, stehst du auf dem Schlauch.

Ich finde es verwirrend, dass ein Benutzername mehrfach vorkommen darf.

Grüße,

Christoph