gpt4 book ai didi

c# - 如何用ADO.NET/C#做多表参数化查询?

转载 作者:行者123 更新时间:2023-12-02 22:11:05 26 4
gpt4 key购买 nike

我想对 SQLquery 进行参数化查询,可以是这样的:

SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN (1, 2, 3));

这些值来自 WS 接口(interface),虽然我可以信任消费者,但我想安全地使用它并使用涉及 DbParameters 的参数化查询来防止 SQL 注入(inject)。怎么做?

谢谢!

最佳答案

正如您所注意到的,关键点是使用参数。 IN 子句是众所周知的问题,令人讨厌。现在,如果您知道这些值都是整数(例如,您将一个 int[] 参数传递给您的 C# 方法),那么您可以几乎摆脱的事情喜欢:

cmd.CommandText = "SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN ("
+ string.Join(",", values) + "))"; // please don't!!!

这太可怕了,提出了一种非常糟糕的做法(如果有人为字符串复制它,你将陷入痛苦的世界),并且不能使用查询计划缓存。您可以做类似的事情:

var sb = new StringBuilder("SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN (");
int idx = 0;
foreach(var val in values) {
if(idx != 0) sb.Append(',');
sb.Append("@p").Append(idx);
cmd.Parameters.AddWithValue("@p" + idx, val);
idx++
}
sb.Append("))");
cmd.CommandText = sb.ToString();

哪个更可取,但很尴尬。

或者最简单:使用类似 dapper 的工具,让图书馆为它操心:

var data = conn.Query<YourType>(
"SELECT * FROM Table1 WHERE Col1 IN (SELECT Col2 FROM Table2 WHERE Col3 IN @values)",
new { values });

这里 dapper 指出用法并“做正确的事”。它还为您处理“0 值”情况。

关于c# - 如何用ADO.NET/C#做多表参数化查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com