Ich habe eine winforms-Anwendung, die einen Benutzer anmeldet, indem überprüft wird, ob ihre Benutzerberechtigungen, Benutzername und Kennwort alle vor dem Anmelden übereinstimmen. Die Datenbank hat derzeit nur drei Benutzer zu Testzwecken.C# Ausführen von SQL-Abfrage in Backgroundworker
Das Problem, das mir bevorsteht, ist, wenn ich versuche, mich einzuloggen, friert das Programm für mindestens 30 Sekunden ein, bevor ich mich einlogge. Ich habe überall gesucht, um eine Lösung zu finden. Ich habe einen Backgroundworker ausprobiert, aber das funktioniert auch nicht für mich; vielleicht benutze ich es falsch.
Dies ist der Code verwendet
frmLogins.cs
private void btnLogin_Click(object sender, EventArgs ev)
{
try
{
SqlDataAdapter sda = new SqlDataAdapter("Select count(*) from Logins where Username='" + txtUserName.Text + "' and Password='" + txtPassword.Text + "' and Type='" + cbType.Text + "'", scon);
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows[0][0].ToString() == "1")
{
sda1 = new SqlDataAdapter("Select Type from Logins where Username='" + txtUserName.Text + "' and Password='" + txtPassword.Text + "'", scon);
dt1 = new DataTable();
sda1.Fill(dt1);
//Check if user matches with admin then log them in
if (dt1.Rows[0][0].ToString() == "Admin")
{
lblMessage.Text = "Logging Successful!";
SnackBarTimer();
Hide();
AdminForm admin = new AdminForm();
admin.Show();
}
//Check if user matches with secretary then log them in
if (dt1.Rows[0][0].ToString() == "Secretary")
{
lblMessage.Text = "Logging Successful!";
SnackBarTimer();
Hide();
frmMain main = new frmMain();
main.Show();
}
//Check if user matches with employee then log them in
if (dt1.Rows[0][0].ToString() == "Employee")
{
}
lblMessage.Text = "Logging In...";
SnackBarTimer();
}
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
SnackBarTimer();
}
finally
{
scon.Close();
}
}
Haben Sie festgestellt, was 30er Jahre dauert? Hast du eine Analyse gemacht und es zeigt auf deine SQL? – AlG
Scheint so, dass SQL nicht langsam sein sollte, es sei denn, Sie haben Millionen von Benutzern und keinen Index für Benutzername oder Passwort (selbst dann 30s ist sehr hoch). Einige Gedanken: 1) Sie benötigen keine DataTable, um die Existenz eines Datensatzes zu überprüfen; Verwenden Sie 'ExecuteScalar' - 2) Sie können den Typ in der ersten Abfrage auswählen, anstatt erneut zu fragen, um den Typ zu erhalten, 3) Holen Sie sich einen anständigen Profiler (oder schlimmstenfalls debuggen Sie es, manuelle Zeitmessung der Anrufe), um sicherzustellen, dass Sie wissen, was Engpass ist. Ich wette, es ist irgendwo in 'SnackBarTimer()' –
BTW. Jemand kann Ereignis löschen Ihre Datenbank mit SQL-Injection-Angriff. Verwenden Sie KEINE Zeichenfolge verketten, SQL-Abfrage erstellen! –