-1
ログインする前にユーザ特権、ユーザ名、パスワードがすべて一致するかどうかをチェックしてユーザをログインさせるwinformsアプリケーションがあります。C#バックグラウンドワーカーでsqlクエリを実行
私が直面している問題は、ログインしようとすると、ログインする前にプログラムが少なくとも30秒間フリーズします。私はどこでも解決策を探すために検索しました。しかし、私はバックグラウンドワーカーを試してみましたが、どちらも私にとってはうまくいきません。多分私はそれを間違って使用しています。
これは私がしかし、私はきちんとので、今のフォームはdoesnのBackgroundWorkerのを実装する方法を考え出し、ラグを削除できませんでした
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();
}
}
あなたは何が30sを取っているのか判断しましたか?あなたは分析をして、あなたのSQLを指していますか? – AlG
何百万人ものユーザーがいて、ユーザー名やパスワードに索引がない(30秒も非常に高い)場合を除き、SQLは遅くならないようです。いくつかの考え:1)レコードの存在をチェックするためにDataTableは必要ありません。 'ExecuteScalar'を使用する - 2)タイプを取得するために再度クエリするのではなく、最初のクエリでタイプを選択できます。3)適切なプロファイラを取得します(最悪の場合はそれをデバッグして手動で呼び出します)。ボトルネックは。私はそれが 'SnackBarTimer()' –
BTWのどこかにあると賭けています。 SQLインジェクション攻撃を使用してデータベースを削除することができます。 SQLクエリを作成する文字列連結を使用しないでください! –