没有设置ASP.NET参数的DynamicSQL

时间:2013-10-01 15:09:18

标签: asp.net sql dynamic-sql

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

1 个答案:

答案 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));
        }
    }
}