C# Funktion in anderer Form übernehmen (Login System)

Gotenks666

Ensign
Registriert
Mai 2009
Beiträge
165
Guten Abend liebe CB Community

Wiedereinmal brauche ich ein wenig Nachhilfe von euch.

Folgendes Problem.

Ich habe 2 WindowsForms: LoginForm und MainForm.

In der ersten Form also die LoginForm logge ich mich mit folgendem MySQL Funktion an, und werde auf die 2te Form (MainForm) weitergeleitet wenn die Logindaten richtig sind.

Code:
public bool tryLogin(string username, string password)
        {
            MySqlConnection con = new MySqlConnection("host=***;user=***;password=***;database=***;");
            //MySqlConnection con = new MySqlConnection("host=corvus.uberspace.de;user=gerry;password=;database=_test;");
            MySqlCommand cmd = new MySqlCommand("SELECT * FROM user WHERE username = '" + username + "' AND passwort = '" + password + "';");
            cmd.Connection = con;
            con.Open();
            MySqlDataReader reader = cmd.ExecuteReader();
            if (reader.Read() != false)
            {
                if (reader.IsDBNull(0) == true)
                {
                    cmd.Connection.Close();
                    reader.Dispose();
                    cmd.Dispose();
                    return false;
                }
                else
                {
                    cmd.Connection.Close();
                    reader.Dispose();
                    cmd.Dispose();
                    return true;
                }
            }
            else
            {
                return false;
            }
        }
         public string CreateMD5Hash(string password)
         {
             MD5 md5 = System.Security.Cryptography.MD5.Create();
             byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(password);
             byte[] hashBytes = md5.ComputeHash(inputBytes);


             StringBuilder sb = new StringBuilder();
             for (int i = 0; i < hashBytes.Length; i++)
             {
                 sb.Append(hashBytes[i].ToString("X2"));
             }
             return sb.ToString();
         }

Ich möchte eine Art Login User System erstellen, dass wenn man sich einloggt in der LoginForm, in der MainForm sein Username steht und ein paar andere Dinge aus der Datenbanktabelle des Users (Username,Level,Email.. etc)

Doch wie schaffe ich das..?

Ich hoffe ihr könnt mir ein wenig helfen.
 
Indem du z.B. ein Property User vorhälst und in der MainForm prüfst, ob es null ist oder was auch immer..

Code:
class LoginForm
{
    ...
    public User CurrentUser { get; private set; }
    ...
}

Code:
class MainForm
{
    ...
    void DoLogin(...)
    {
         LoginForm form = new LoginForm();
         form.ShowDialog();
         if ( form.CurrentUser != null )
         {
             // irgendwas mit dem User tun...
         }
    }
    ...
}

Dann noch ein paar zusätzliche Anmerkungen:
  1. DeinCode läd zu Usernamen wie z.B. admin'-- ein :D (Stichwort SQL-Injection)
  2. Gewöhn dir an using oder try...finally zu benutzen. Dein Reader und Command bleiben offen, wenn du keine Daten lesen kannst (nur als Beispiel)
 
hi, in aller kürze:

man könnte vieles besser machen.
zunächst, frontend vom backend trennen. deine loginform beinhaltet nicht die authentifizierungslogik und auch keinesfalls hat sie direkten datenbankzugriff.

erstell dir für den anfang noch ein weiteres projekt, das du z.B. "DeineAnwendung.Backend" nennst. hier zwei klassen rein.

eine für den generellen datenzugriff, diese kann statisch sein (static), hat den charme, dass du nicht jedes mal eine neue instanz der klasse erstellen musst. wenn die klasse z.b. CData.cs heißt und eine funktion darin GetUserByUsernameAndPassword(string username, string pw), kannst du die funktion aus jeder anderen klasse (sofern verweise vorhanden) einfach über CData.GetUserByUsernameAndPassword("user", "pw") aufrufen.
in diese CData kommt alles rein, was mit datenbank-kommunikation zu tun hat.

die zweite beinhaltet die businesslogik, die kannst du z.b. CCore.cs nennen.
hier hättest du dann beispielsweise eine funktion drin AuthenticateUser(string username, string password), die dir einen bool wert zurückgibt (oder ein objekt das den user aus der db repräsentiert, bzw. null, wenn keiner gefunden wurde). diese funktion ihrerseits ruft die funktion GetUserByUsernameAndPassword() in deiner CData auf.

nun hast du UI, businesslogik und datenzugriff getrennt. treibst du es auf die spitze, erstellst du für die datenbank-geschichte ein extra projekt in deiner mappe. willkommen im model (datenbank) - view (UI) - controller (businesslogik) pattern, kurz mvc :)

LoginForm --> Username, Password --> CCore.AuthenticateUser("user", "pass") --> CData.GetUserByUsernameAndPassword("user", "pass") --> objekt vom typ CUser oder null zurück an AuthenticateUser() --> objekt vom typ CUser oder null zurück an LoginForm. --> wenn CUser und nicht null zurückkommt, MainForm laden, als parameter das CUser objekt übergeben.

so... weiter.

wenn du in deinem commandstring "SELECT ..." parameter einfügen willst (z.b. username), mach das bitte nicht im string selbst. benutze parameter:

http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

angenommen dein user ist authentifiziert und authorisiert zur mainform zu gelangen.
übergibt z.b. die userdaten einfach an die mainform:

http://msmvps.com/blogs/deborahk/archive/2009/09/21/passing-data-between-forms-constructor.aspx

ich nehme an, dass du eine klasse (gehört in dein backend) wie CUser.cs hast, die properties wie name, email, loginname, etc besitzt. wenn dein user eingelogged wurde, erstellst du einfach ein neues user-objekt und übergibst das deiner mainform.

hier kannst du dann mit diesem objekt weiterarbeiten.


in summe sieht es so aus, als solltest du dich etwas mehr mit objektorientierung, klassen, ado.net und grundlagen befassen. wird schon :)
 
Zuletzt bearbeitet:
Guten Tag.
Das ist eine Schulaufgabe, und leider habe ich nicht soviel Ahnung vom objektorientierung.(Ich habe sehr oft in der schule gefehlt wegen krankenhaus und habe daher kaum etwas mitbekommen)

Wenn ihr mir eventuell etwas mehr auf die sprünge helfen könntet , wie ich das mit meinem Code anstellen könnte wäre das klasse!
 
mit deinem code.. nichts :) schreibe dir morgen was zusammen.. sofern hier bis dahin nichts brauchbares steht.

allerdings.. egal was ihr da "in der schule" macht.. wenn ihr c# benutzt, sollte und darf dir "objektorientierung" nicht fremd sein. ist das a und o.
 
Zurück
Oben