6
string user = "1234";
string strSQL = string.Format("Select * From User where UserId = '{0}'",user);
SqlCommand myCommand = new SqlCommand(strSQL, cnn);
reader = myCommand.ExecuteReader();

我的User表由UserIdPassword列组成。列UserId类型是nchar,所以我使用了单引号。我收到一条错误消息

关键字用户附近的语法不正确”

(我猜User这里提到了表名)。

我有正确的连接字符串和其他与数据库环境相关的东西,因为我已经检查了数据库连接状态并且它是打开的(在程序执行期间)。

语法有什么错误?我无法从我的表中检索行。

4

4 回答 4

9

User是一个关键字。在它周围使用方括号以避免错误。Select * from [User]

string strSQL = string.Format("Select * From [User] where UserId = '{0}'",user);

此外,您应该始终使用如下参数化查询来防止 SQL 注入攻击:

string strSQL = string.Format("Select * From [User] where UserId = @UserId");
于 2013-01-02T10:57:07.743 回答
8

你真的应该为此使用参数:

string user = "1234";

using (SqlCommand command = new SqlCommand("select * from [User] where UserId = @userid", cnn))
{
    command.Parameters.AddWithValue("@userid", user);

    using (SqlDataReader reader = myCommand.ExecuteReader())
    {
        // iterate your results here
    }
}

其他海报很好地发现了,我从来没有用你的表名抓住保留词。我已经修改了我的答案 - 但不能因为错过了显而易见的事情而受到赞扬!

于 2013-01-02T10:58:15.827 回答
3

你应该user用括号括起来[]

string strSQL = string.Format("Select * From [User] where UserId = '{0}'",user);

上面的查询容易受到SQL Injection. 应该对其进行参数化以避免这种情况。下面是一个例子:

string user = "1234";
string strSQL = "Select * From [User] where UserId = @userID";
SqlCommand myCommand = new SqlCommand(strSQL, cnn);
myCommand.AddWithValue("@userID", user);
reader = myCommand.ExecuteReader();

使用以下

  • Try-Catch阻止正确捕获错误
  • using正确处置物品的声明

片段:

string user = "1234";
string strSQL = "Select * From [User] where UserId = @userID";
using (SqlConnection cnn = new SqlConnection("connection string here"))
{
    using (SqlCommand myCommand = new SqlCommand(strSQL, cnn))
    {
        myCommand.Parameters.AddWithValue("@userID", user);
        using (SqlDataReader reader = myCommand.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine(reader["columnName"].ToString());
            }
        }
    }
}
于 2013-01-02T10:57:11.660 回答
2

[]. 它是一个关键字。阅读Reserved KeywordsMSDN 上的文章。

string strSQL = string.Format("Select * From [User] where UserId = '{0}'",user);

但更重要的是,您的查询可能会受到SQL Injection攻击。您应该始终使用参数化查询。

string strSQL = "Select * From [User] where UserId = @userID";
SqlCommand myCommand = new SqlCommand(strSQL, cnn);
myCommand.Parameters.AddWithValue("@userID", user);
于 2013-01-02T10:57:42.473 回答