我有一个到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
没有被替换(或者至少我在调试控制台中看不到替换)。
我做错了什么?
编辑:
谢谢你的回复。省略单引号(')就可以了。
我还了解到这不是字符串替代品。谢谢。
只需一个字:连接不会一直打开。当它不再需要时,它会立即关闭;并在需要时重新建立 - 我只是忘了将其写入我的示例代码中。
再次:谢谢你的帮助!
答案 0 :(得分:2)
您无法在调试会话中看到它被替换;替换发生在SQL服务器代码本身......
客户端(您的代码)将SQL字符串和参数值作为单独的内容发送到服务器。在执行它时,SQL Engine'将'参数替换为其值。
您还应该将'通配符'放在参数值内,而不是放在查询中。
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 + "%";
答案 1 :(得分:1)
该参数无效,因为它位于字符串文字内。你想构建这样的字符串:
cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE '%' + @fv + '%'");
虽然我们正在努力,但保持这样的全球联系是不好的。它可能会导致奇怪的副作用,尤其是在Web应用程序中。相反,保持全局连接 string ,然后使用该字符串在每个请求上创建新连接。
此外,“替换”在这里是错误的词。 Sql参数被从不替换,即使它们有效。这就是重点。在任何时候都没有字符串替换您的查询。它更像是在存储过程中在服务器级别声明了@fv
变量,并将数据直接分配给该变量。通过这种方式,参数替换代码中不存在漏洞,因为查询的数据部分在整个执行过程中保持独立。同样,不要考虑“清理”查询的参数;相反,请考虑隔离数据。