1

ユーザーがログインボタンをクリックすると、SQLクエリを実行して、ユーザー名==ユーザー名テキストボックスとパスワード==パスワードテキストボックスの行を検索する単純なログイン画面があります。私のコードのこのセクションは正常に動作します。

ただし、新しいフォームを開き、ログイン フォームを閉じる if ステートメントを実行しようとすると、ステートメント文字列の比較が正しいことを確認するためにいくつかのメッセージ ボックスを追加したにもかかわらず、エラーが発生します。

何か案は?

ログインボタン:

private void btnLogin_Click(object sender, EventArgs e)
    {
        try
        {
            string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DebenhamsProjectOfficeDatabase.mdf;Integrated Security=True;User Instance=True";
            SqlConnection cn = new SqlConnection(connection);
            cn.Open();
            string userText = txtUsername.Text;
            string passText = txtPassword.Text;
            SqlCommand cmd = new SqlCommand("SELECT ISNULL(Username, '') AS Username, ISNULL(Password,'') AS Password FROM Users WHERE Username='" + userText + "' and Password='" + passText + "'", cn);

            SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                MessageBox.Show(userText + " / " + dr["Username"].ToString());
                MessageBox.Show(passText + " / " + dr["Password"].ToString());
                if (dr["Username"].ToString() == userText && dr["Password"].ToString() == passText)
                {
                    this.Hide();
                    Dashboard dashboard = new Dashboard();
                    dashboard.ShowDialog();
                    this.Close();
                }
                else
                {
                    MessageBox.Show("Invalid Username or Password");
                }
            }
            dr.Close();
            cn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

ログイン試行: ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力


以下の回答とコメントからのアドバイスにより、コードは次のように修正されました (sql コマンドで sql パラメーターを使用)。

private void btnLogin_Click(object sender, EventArgs e)
    {
        try
        {
            string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DebenhamsProjectOfficeDatabase.mdf;Integrated Security=True;User Instance=True";
            SqlConnection cn = new SqlConnection(connection);
            cn.Open();
            string userText = txtUsername.Text;
            string passText = txtPassword.Text;
            SqlCommand cmd = new SqlCommand("SELECT ISNULL(Username, '') AS Username, ISNULL(Password,'') AS Password FROM Users WHERE Username = @username and Password = @password", cn);
            cmd.Parameters.Add(new SqlParameter("username", userText));
            cmd.Parameters.Add(new SqlParameter("password", passText));

            SqlDataReader dr = cmd.ExecuteReader();

            try
            {
                dr.Read();
                if (dr["Username"].ToString().Trim() == userText && dr["Password"].ToString().Trim() == passText)
                {
                    this.Hide();
                    Dashboard dashboard = new Dashboard();
                    dashboard.ShowDialog();
                    this.Close();
                }
            }
            catch
            {
                MessageBox.Show("Invalid Username or Password");
            }
            dr.Close();
            cn.Close();
        }
4

2 に答える 2

1

それらをチェックしながら、SQLリターンの最後にtrim()を追加してみてください。

dr["Username"].ToString().trim()dr["Password"].ToString().trim()

データベースには、見えない余分なスペースが保存されることがあります。

于 2013-04-08T12:07:51.273 に答える
0

これを試してみてください:うまくいくと思います

SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Username='" + userText.toString() + "' and Password='" + passText.toString() + "'", cn);

        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        {
            MessageBox.Show(username + " / " + usertext);
            MessageBox.Show(password + " / " + passtext);
            this.Hide();
            Dashboard dashboard = new Dashboard();
            dashboard.ShowDialog();
            this.Close();
        }
        else
        {
                MessageBox.Show("Invalid Username or Password");
        }
于 2013-04-08T12:11:28.087 に答える