1

我有一个到 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没有被替换(或者至少我在调试控制台中看不到替换)。

我究竟做错了什么?

编辑:

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

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

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

再次:感谢您的帮助!

4

2 回答 2

2

您在调试会话中看不到它被替换;替换发生在 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 + "%";
于 2013-06-24T15:03:38.830 回答
1

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

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

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

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

于 2013-06-24T15:08:03.350 回答