SQL Server从c#中选择查询执行

时间:2013-01-02 10:55:16

标签: c# sql-server select

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"

附近的语法不正确

(我想这里引用的是表名User)。

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

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

4 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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
    }
}

其他海报很好地发现,我从来没有用你的表名抓住保留字。我已经修改了我的答案 - 但是因为错过了明显的答案而无法归功于你!

答案 2 :(得分: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());
            }
        }
    }
}

答案 3 :(得分:2)

使用[]换行。这是一个关键字。阅读MSDN上的Reserved Keywords文章。

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