0

我使用这段 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);
    }
4

1 回答 1

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));
        }
    }
}
于 2013-10-01T15:16:51.657 回答