【问题标题】:SQL Server: Parameter is not replacedSQL Server:参数未替换
【发布时间】:2013-06-24 15:01:46
【问题描述】:

我有一个到 SQL Server 数据库(版本 10.50.4000)的功能齐全(安全)的会话。这存储在一个公共变量中:

SqlConnection conn = new SqlConnection();

我只想运行SELECT 查询。对于其他任何事情,用户帐户都没有权限。

查询仅使用一个用户条目构建,该条目被插入到一个简单的文本框中。

很遗憾,我不能告诉你原来的命令文本。所以我为你简化了:

function print_users(string filtervalue)
{
    SqlCommand cmd = null;
    cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE '%@fv%'", this.conn)

    cmd.Parameters.Add("@fv", SqlDbType.NVarChar);
    cmd.Parameters["@fv"].Value=filtervalue;

    rdr = cmd.ExecuteReader();

    while(rdr.Read())
    {
        //Do something with the answer from the DB
    }
}

但这并不能解决问题。我也试过AddWithValue,但没有运气。

在应该替换@fv 的行上创建停止点时,我可以逐行浏览代码。而且我可以看到应该替换@fv 的命令被正确处理,没有错误。但是@fv 没有被替换(或者至少我在调试控制台中看不到替换)。

我做错了什么?

编辑:

感谢您的回复。省略单引号 ( ' ) 就可以了。

而且我还了解到这不是字符串替换。谢谢。

一句话:连接不是一直打开的。当不再需要它时,它会立即关闭;并在需要时重新建立——我只是忘了把它写到我的示例代码中。

再次感谢您的帮助!

【问题讨论】:

  • 字符串中的参数不会被替换。它们在 RPC 调用中作为 PARAMETERS 发送到服务器。如果您使用 SQL Server Profiler 开始跟踪,您会看到这一点

标签: sql-server parameters sqlcommand


【解决方案1】:

您在调试会话中看不到它被替换;替换发生在 SQL Server 代码本身中......

客户端(您的代码)将 SQL 字符串和参数值作为单独的东西发送到服务器。 SQL 引擎在执行时将参数“替换”为参数值。

您还应该将“通配符”放在参数值中,而不是在查询中。

cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE @fv ", this.conn)
cmd.Parameters.Add("@fv", SqlDbType.NVarChar);
cmd.Parameters["@fv"].Value= "%" + filtervalue + "%";

【讨论】:

    【解决方案2】:

    该参数不起作用,因为它位于字符串文字内。你想像这样构建字符串:

    cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE '%' + @fv + '%'");
    

    虽然我们这样做了,但保持这样的全球联系是不好的。它可能会导致奇怪的副作用,尤其是在 Web 应用程序中。相反,保留一个全局连接 string,然后使用该字符串在每个请求上创建一个新连接。

    此外,“替换”在这里是错误的词。 Sql 参数从不被替换,即使它们起作用。这就是重点。在任何时候,您的查询都没有字符串替换。这更像是您在存储过程中在服务器级别声明了一个@fv 变量,并将您的数据直接分配给该变量。这样,参数替换代码中就不存在漏洞的可能性,因为查询的数据部分在整个执行过程中保持分离。同样,不要考虑“清理”查询的参数;相反,请考虑隔离数据。

    【讨论】:

    • 在客户端包含通配符会不会更好,以避免在 SQL 查询中连接?
    • 我发现这在将来的维护方面更清洁。下一个程序员只是将用户输入直接发送到查询。但这是一种偏好。
    • 我也不喜欢操纵参数,部分原因是答案最后一段中提到的原因。将通配符添加到参数字符串与更改查询字符串感觉就像清理与隔离。这不是一个确切的类比,但它对我来说有这种感觉。
    猜你喜欢
    • 2021-10-25
    • 2021-04-28
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多