我使用这个dynamicSQL代码。
问题是,当我在运行时检查cmd.CommandText值时,@ ID_USER和@SEARCH在SQL查询中保持原始状态,它读取
"SELECT Comment FROM Comments WHERE UserId = @ID_USER AND Comment like '% @SEARCH %'"
所以语法是正确的,cmd.Parameters ResultView .SqlValuein VS2012为我提供了@USER_ID和@SEARCH的正确输入值 感谢。
{
List<string> searchResults = new List<string>();
//Get current user from default membership provider
MembershipUser user = Membership.Provider.GetUser(HttpContext.User.Identity.Name, true);
if (user != null)
{
if (!string.IsNullOrEmpty(searchData))
{
// SqlCommand cmd = new SqlCommand("Select Comment from Comments where UserId = '" + user.ProviderUserKey + "' and Comment like '%" + searchData + "%'", _dbConnection);
/**********************************************/
_dbConnection.Open();
const string QUERY =
@"SELECT Comment" +
@" FROM Comments" +
@" WHERE UserId = @ID_USER" +
@" AND Comment like '% @SEARCH %'";
var cmd = new SqlCommand(QUERY, _dbConnection);
cmd.Parameters.AddWithValue("@ID_USER", user.ProviderUserKey.ToString());
cmd.Parameters.AddWithValue("@SEARCH", searchData.ToString());
/**********************************************/
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
searchResults.Add(rd.GetString(0));
}
rd.Close();
_dbConnection.Close();
}
}
return View(searchResults);
}
答案 0 :(得分:1)
不,参数保留在命令文本中是正确的。
这是因为实际传递给服务器的内容如下所示:
exec sp_executesql N'SELECT Comment FROM Comments WHERE UserId = @ID_USER AND Comment like ''% + @SEARCH %''',
N'@ID_USER int,@SEARCH nvarchar(max)',
@ID_USER=1,
@SEARCH=N'some search text';
因此,即使将参数传递给服务器,您的参数也会保留在原位。这就是您仍然可以在命令文本中看到它们的原因。
除此之外,您的查询无法按预期工作,在此行中:
AND Comment like '% @SEARCH %'
您正在寻找Comment实际包含“@Search”的位置,而不是分配给参数的值。你需要的是:
AND Comment like '%' + @SEARCH + '%'
另一个稍微不相关的观点是,重用SqlConnections没有必要,也没有用。为每个连接定义一个新的连接。 .NET足够智能,可以通过汇集它们来重用连接,不要重新发明轮子。同时使用using
块来确保您的一次性课程被处理掉:
所以我会让你的整个读者阻塞如下:
string sql = "SELECT Comment FROM Comments WHERE UserID = @ID_USER AND Comment LIKE '%' + @Search + '%'";
using (var connection = new SqlConnection(YourConnectionString))
using (var command = new SqlCommand(sql, connection))
{
command.Parameters.AddWithValue("@ID_USER", user.ProviderUserKey.ToString());
command.Parameters.AddWithValue("@SEARCH", searchData.ToString());
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
searchResults.Add(rd.GetString(0));
}
}
}