Login funktioniert nicht.



  • So, da ich noch gerne ein Admin Panel für mein Programm haben würde, hab ich jetzt ein kleines Problem mit meinem Login.

    String ^_Name; 
    String ^_Passwort;  
    _Name = this->metroTextBox1->Text;
    _Passwort = this->metroTextBox2->Text;
    
    sqlConnection1->Open();
    SqlCommand ^command = gcnew SqlCommand("SELECT ID FROM Admins WHERE Name = ('"+_Name+"') AND Passwort = ('"+_Passwort+"')", sqlConnection1);
    int affectedrows = command->ExecuteNonQuery();
    MessageBox::Show(""+ affectedrows);
    

    Wie man sieht vergleich ich die Daten in der Textbox mit meiner Admin Datenbank.
    Das Problem ist das wenn ich richtige oder falsche Daten eingebe, werden -1 Zeilen gefunden, das Problem liegt warscheinlich in der SQL Abfrage.



  • Das Problem liegt nicht an der Abfrage selbst, sondern wie du diese absetzt.

    Ein "NonQuery" auf eine Abfrage bringt nichts. - NonQuery bietet sich für INSERTS, UPDATES und DELETES an. Dort wird dir dann die Anzahl zurück geliefert, wie viele Daten betroffen waren.

    Für dich ist eher ein Weg über den DataAdapter richtiger. Im folgenden ein Beispiel (in C#, sollte sich aber leicht übernehmen lassen):

    DataTable resultTable = new DataTable();
    using (var connection = new SqlConnection(connectionString))
    {
           var command = connection.CreateCommand();
           command.CommandText = "SELECT * FROM Admins WHERE Name = '@Name' AND Passwort = '@Password'";
           command.CommandType = CommandType.Text;
    
           command.Parameters.Add(new SqlParameter("@Name", name));
           // $$ Passwort ist hoffentlich verschlüsselt!
           command.Parameters.Add(new SqlParameter("@Password", password));
    
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = command;
            adapter.Fill(dtResult);
            connection.Close();               
    }
    
    // Login war erfolgreich wenn die Tabelle exakt einen Datensatz enthält
    


  • Falls das mal jemand braucht, ich habs hinbekommen aber nicht genau so wie mein Vorredner:D

    String ^_Name; 
    String ^_Passwort;  
    _Name = this->metroTextBox1->Text;
    _Passwort = this->metroTextBox2->Text;
    
    sqlConnection1->Open();
    SqlCommand ^command = gcnew SqlCommand("SELECT count(*) FROM Admins WHERE Name = ('"+_Name+"') AND Passwort = ('"+_Passwort+"')", sqlConnection1);
    SqlDataReader ^myReader;
    myReader = command->ExecuteReader();
    myReader->Read();
    int i = myReader->GetInt32(0);
    
    switch( i )
    {
    case 1:
    MessageBox::Show("Login erfolgreich!");
    break;
    case 0:
    MessageBox::Show("Login fehlgeschlagen!");
    break;
    


  • In meinem Beispiel waren ein paar Sachen, die dir sicher später mal das Leben erleichtern.

    Willst du dir nicht eventuell doch die Mühe machen, dass nochmal zu überarbeiten? Speziell die Parameter solltest du dir unbedingt ansehen und auch das Using ist nicht zu verachten. 😉

    Außerdem ein paar Anmerkungen:
    Was passiert wenn du wiedererwarten mehr als nur einen Eintrag hast?



  • Wobei es using von C# in C++/CLI in der Form nicht gibt.


Log in to reply