SQL Server从C#执行select查询

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

我的“用户”表由“用户ID”和“密码”栏位组成。“用户ID”栏位类型为“nchar”,因此我使用了单引号。但是,我收到一个错误,提示“关键字用户附近的语法不正确”。(我猜这里指的是表名“用户”)。
我已经正确设置了连接字符串和其他数据库环境相关的事项,因为我已经检查过数据库连接状态并且它在程序执行期间处于打开状态。
语法错误在哪里?我无法从我的表中检索行。

在SQLCommand命令行上设置断点,然后获取strSQL的值,复制字符串并粘贴到SSMS中。执行并检查查询。如果没有表设计,很难诊断语法错误是什么。 - zeencat
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");

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
    }
}

其他用户发现了问题,我没有注意到你的表名与保留字冲突。我已经修改了我的答案-但不能因为没有注意到显而易见的错误而获得荣誉!


4

你应该使用方括号[]来包围user

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

上述查询容易受到SQL注入攻击。应该使用参数化的方式来避免这种情况。以下是一个示例:

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

1
我认为你的代码中有一些错误。 "myCimmand" 拼写错误,并且看起来你在应该使用方括号时使用了括号,也许是这样吗?我不确定你在第4行做了什么? - Matt

2

[]括起来。这是一个关键字。阅读MSDN的Reserved Keywords文章。

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

但更重要的是,您的查询面临SQL注入攻击。您应该始终使用参数化查询。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接