DataContext ExecuteQuery

时间:2012-08-20 00:20:50

标签: c# sql sql-server linq-to-sql xquery

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不执行。

有什么理由吗?此外,param是否针对常见的SQL注入模式进行了验证?

感谢您的任何指示!

2 个答案:

答案 0 :(得分:3)

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

您正在尝试使用接收参数的重载版ExecuteQuery。参数必须作为Object数组传递,例如:

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";

答案 1 :(得分:1)

对于像我这样通过谷歌绊倒的人,ExecuteQuery不会简单地将命令和参数传递给string.Format,因为这会产生注入漏洞。

它用" @ p0"," @ p1"取代命令中的{0},{1},...等,然后将您的参数作为参数添加到sql命令。这可以通过在数据上下文中设置.Log属性来查看实际执行的命令来确认。

所以OP的例子不起作用,因为     f(x)其中x =" a,b,c" 只相当于     F(A,B,C) 如果我们正在做一个简单的字符串替换。如果x是"正确的" SQL参数然后它不起作用。