DataContext ExecuteQuery

4
string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";
string param = "''value1'',''value2'',''value3''";
string sQ = string.Format(query, param);

A: dbContext.ExecuteQuery(sQ);

B: dbContext.ExecuteQuery(query, param);

A能够执行并返回结果,但B不能。

这有什么原因吗?另外,这个参数是否经过常见的SQL注入模式验证?

感谢任何指点!


没有错误。只是没有返回任何结果。有没有办法至少看到发生了什么? - Sam
来自微软页面:要传递给命令的参数数组。请注意以下行为:如果数组中的对象数小于命令字符串中识别出的最高数字,则会引发异常。如果数组包含未在命令字符串中引用的对象,则不会引发异常。如果参数为null,则会转换为DBNull.Value。 - Hanlet Escaño
参数没问题。计数器也一样。 - Sam
您可以检查生成的 SQL:http://msdn.microsoft.com/zh-cn/library/bb386961.aspx - Pleun
2个回答

3

http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery.aspx

您正在尝试使用接收参数的ExecuteQuery的重载版本。参数必须作为对象数组传递,例如:
object[] param = new Object[] { "value1", "value2", "value3" };

无论如何,您的查询只接收一个参数:
string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";

看起来你想传递一个由三个XML值组成的单个参数。我不是XQuery专家,但你可以尝试这个:

object[] param = new Object[] { "''value1'', ''value2'', ''value3''" };
string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";

2
对于通过谷歌搜索并像我一样偶然发现这篇文章的人,ExecuteQuery 并不只是简单地将命令和参数传递给 string.Format,因为那样会创建一个注入漏洞。
它用 "@p0"、"@p1" 等替换命令中的 {0}、{1} 等,并将您的参数添加为 SQL 命令的参数。可以通过设置数据上下文的 .Log 属性来确认此操作,以查看实际执行的命令。
因此,如果 x 是一个“合适”的 SQL 参数,则 OP 的示例无法正常工作,因为 f(x) 其中 x = "a,b,c" 只在进行简单的字符串替换时等同于 f(a,b,c)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接