SQL中的语法不正确?

时间:2014-06-09 10:43:22

标签: c# sql sqlcommand

我正在c#winforms中创建用户登录屏幕,我希望能够根据this link,检查用户的用户名和密码以防止SQL数据库中的记录,但我的代码会抛出一个异常,说“语法不正确靠近用户“。

有人能帮我弄清楚我的代码有什么问题吗?违规代码如下。

 private bool CompareStrings(string string1, string string2)
    {
        return String.Compare(string1, string2, true, System.Globalization.CultureInfo.InvariantCulture) == 0 ? true : false;
    }

    private void LoginBtn_Click(object sender, EventArgs e)
    {
        //var username = textBox1.Text;
        //var password = maskedTextBox1.Text;
        try
        {
            SqlConnection Conn = new SqlConnection("Data Source=***********;Initial Catalog=*********;Persist Security Info=True;User ID=*********;Password=*******");
            SqlCommand com = new SqlCommand();
            com.Connection = Conn;
            Conn.Open();

            com.CommandText = ("SELECT (Username) AS User, (Password) as Pass FROM dbname WHERE User='" + textBox1.Text + "'");
            SqlDataReader reader = com.ExecuteReader();
            var username = textBox1.Text;
            var password = maskedTextBox1.Text;
            while (reader.Read())
            {
                if (this.CompareStrings(reader["User"].ToString(), username) &&
                    this.CompareStrings(reader["Pass"].ToString(), password))
                {
                    MessageBox.Show("Login Authenticated!");

                }
                else
                {
                    MessageBox.Show("Login failed!");

                }
                Conn.Close();
                reader.Close();
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

2 个答案:

答案 0 :(得分:7)

USER是T-SQL中的reserved keyword。您应该使用方括号(如[USER])。 ,最佳解决方案是将名称更改为非保留字。

始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。

USERUsername列的别名。您应该在WHERE子句中使用它的原始名称。

并使用using statement处理您的SqlConnectionSqlCommand以及SqlDataReader

using(SqlConnection Conn = new SqlConnection(connString))
using(SqlCommand com = Conn.CreateCommand())
{
    com.CommandText = "SELECT (Username) AS [User], (Password) as Pass FROM dbname WHERE Username = @user";
    com.Parameters.AddWithValue("@user", textBox1.Text);
    Conn.Open();
    using(SqlDataReader reader = com.ExecuteReader())
    {
       ...
    }
}

答案 1 :(得分:2)

如果您使用的是预定义或由Sql Server保留的任何关键字

,则必须使用方括号

就像你在使用USER一样,你应该使用 [USER]

以及您的查询错误您应使用用户名代替where clause

中的用户

你应该使用这个

 com.CommandText = ("SELECT (Username) AS [User], (Password) as Pass FROM dbname WHERE Username='" + textBox1.Text + "'");