Login - geht das nicht einfacher ?

xMen

Mitglied
Hallo C#-User

ich beschäftige mich seit ca. 3 Wochen mit C# und habe eine Routine erstellt, die beim Programmstart prüft, ob ein User sich korrekt angemeldet hat (Login).
Ich benutze "Visual Studio .Net", "MySql" und den "MySql-DataProvider" von ByteFX.

Da ich die Daten aus der Datenbank nicht anzeigen lassen (logischerweise), erstelle ich über das DataReader-Objekt ein Array mit den benötigten Informationen. Den Inhalt des Array´s vergleiche ich dann mit den Eingaben des Users.

Das klappt ganz wunderbar :p

Nur frage ich mich, da ich noch C#-Anfänger bin, ob meine Vorgehensweise so OK ist und ob das gesamte Konstrukt nicht ein wenig einfacher (sprich: weniger Code) zu gestalten wäre.

Anmerkung: Die Methoden "myLib" und "ProgInfo" stammen aus selbst-geschriebenen Klassen.

Code:
		private void btnOK_Click_1(object sender, System.EventArgs e)
		{
			string mySele = "SELECT u.BenutzerName, u.Kennwort, a.Name, a.Vorname FROM " +
					myLib.myDatabase + ".user AS u, " + myLib.myDatabase + ".adresse AS a " +
					"WHERE (BenutzerName = '" + textBox1.Text + "') AND (Kennwort = '" + textBox3.Text + "') " + 
                    "AND (a.AdressNr=u.AdressNr)";					

			myLib.StartOK = false;
			MySqlCommand myCommand = new MySqlCommand(mySele, myLib.myConnect);
			myLib.myConnect.Open();
			ControlCheck(this, false);

			try {
				MySqlDataReader myReader = myCommand.ExecuteReader();

				try { 
					bool loginOK = myReader.HasRows;
					string[] myArray = new string[4];

					if (loginOK) {
						while (myReader.Read())	{
							for (int i = 0; i < myReader.FieldCount; i++)
								myArray[i] = myReader.GetValue(i).ToString();
						}
						loginOK = (myArray[0] == textBox1.Text) &&	(myArray[1] == textBox3.Text);
					}					

					myLib.StartOK = loginOK;

					if ( loginOK ) {						
						Close();
					} else {
						ProgInfo1.Hinweis("Das Kennwort ist leider falsch, Bitte versuchen Sie es erneut...");
						ControlCheck(this, true);
						textBox3.Focus();
					}

				} catch (MySqlException ex) {
					ProgInfo1.Fehler(ex.Message.ToString());
				} catch (Exception ex){
					ProgInfo1.Fehler(ex.Message.ToString());
				} finally {
					myReader.Close(); myLib.myConnect.Close();
				}

			} catch (MySqlException ex) {
				ProgInfo1.Fehler(ex.Message.ToString());
			} finally {
				myLib.myConnect.Close();
				ControlCheck(this, true);
			}					
		}
 
Na ja, ein paar Dinge gäbs da schon zu verbessern auf den ersten Blick:

Zum Bleistift könntest Du Dir wahrscheinlich die Schleife beim Lesen des Readers sparen, da die Kombination aus Benutzername und Passwort ja höchstwahrscheinlich sowieso eindeutig sein sollte bzw. jeder Benutzername nur 1x vorkommen sollte.

Zum zweiten ist mir aufgefallen, dass Du in den catch-Anweisungen zwar verschiedene Exception-Types abfängst, aber immer die selbe Anweisung innerhalb des Blocks aufrufst. Ich weiss jetzt zwar nicht ob das durch die Verwendung des mySQL-Moduls so sein muss, aber wenn nicht, dann könntest Du auch nur die "normale" Exception abfangen, also so:
Code:
try
{
   // Irgendwelcher Source Code
}
catch (Exception ex)
{
   ProgInfo1.Fehler(ex.Message.ToString());
}
Die äußere try-catch-finally-Anweisung solltest Du Dir im Grunde auch schenken können. Schiebe den Code darin in die zweite (innere) try-catch-finally-Anweisung. Das sollte sich aufs selbe rauslaufen. Evtl. musst Du dadurch den anderen Quelltext auch etwas umstrukturieren.

Den Open-Befehl der Datenbankverbindung würde ich übrigens auch in den try-Block aufnehmen. Da passieren oft Ausnahmen.

Das wär mir jetzt auf den ersten Blick mal so aufgefallen, aber ich übernehme keine Garantie. ;)
 
Hallo Saber,

ich hatte schon garnicht mehr mit einer Antwort gerechnet, aber schön, dass es doch noch geklappt hat. Ich werde mal einige Sachen ausprobieren, die Du dargestellt hast.

Dass mit der Exception-Behandlung ist so eine Sache!

Normalerweise denke ich ebenfalls, dass man mit 1 Fehler-Abfang-Routine auskommen sollte. Da aber in allen Dokumentationen zum ByteFX-MySql-Treiber als Beispiel das Abfangen sowohl der speziellen MySQL-Exceptionklasse als auch der "normalen" Exceptionklasse dargestellt wurde, habe ich das auch so gemacht.

Wenn ich den geänderten Code fertig habe, werde ich den hier ´mal plazieren. Vielleicht hat ja ein anderer C#-Anfänger ein ähnliches Problem...
 

Neue Beiträge

Zurück