【问题标题】:Incorrect Syntax in SQL?SQL中的语法不正确?
【发布时间】:2014-06-09 10:43:21
【问题描述】:

我正在 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());
        }

【问题讨论】:

  • 尝试在查询中写类似 [User] 的用户
  • 请使用参数化查询。通过使用未经处理的用户输入构建查询,您的代码很容易受到 SQL 注入的攻击。看起来好像您正在以纯文本形式存储用户凭据...

标签: c# sql sqlcommand


【解决方案1】:

USER 是 T-SQL 中的 reserved keyword。您应该将它与方括号一起使用,例如[USER]不过,最好的解决办法是把名字改成非保留字。

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

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

并使用using statement 处理您的SqlConnectionSqlCommandSqlDataReader

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())
    {
       ...
    }
}

【讨论】:

  • 谢谢 Soner,这解决了我最初的问题,但在我标记为已回答之前,您能帮我解决另一个问题吗?当我尝试断点时,上面代码中的 while 循环似乎不会触发,你能看到任何可能导致这种行为的错误吗?
  • @Reece 检查我的答案,你的 where 子句有错误
  • 结合这个答案解决了我的问题,感谢您的帮助绅士;非常感谢!
【解决方案2】:

如果您使用的是由 Sql Server 预定义或保留的任何关键字,则必须使用方括号

在这里你使用USER 你应该使用[USER]

而且您的查询错误您应该在where clause

中使用username而不是user

你应该使用这个

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

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2017-02-07
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多