string user = "1234";
string strSQL = string.Format("Select * From User where UserId = '{0}'",user);
SqlCommand myCommand = new SqlCommand(strSQL, cnn);
reader = myCommand.ExecuteReader();
我的User
表包含UserId
和Password
列。 UserId
列类型为nchar
,因此我使用了单引号。我收到一条错误说
关键字User"
附近的语法不正确
(我想这里引用的是表名User
)。
我已正确连接字符串和其他与数据库环境相关的内容,因为我检查了数据库连接状态并且它已打开(在程序执行期间)。
语法中的错误是什么?我无法从表格中检索行。
答案 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);