如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?
Posted
技术标签:
【中文标题】如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?【英文标题】:How to pass a custom subquery to SQL command in ADO.NET? 【发布时间】:2021-04-27 04:12:26 【问题描述】:我经常不得不“在代码中”构建冗长而困难的查询。我知道,我可以使用SqlDataAdapter.SelectCommand.Parameters.Add()
方法传递任何参数。但是,如果我在某些情况下需要像这样进行多个串联,我该怎么办:
var subquery = ConstructSubquery(param1, paramN);
query += subquery;
等等。 VS 中的代码分析器让我可以使用参数而不是简单的字符串连接,但类似于
dataBaseSQL.SqlDataAdapter.SelectCommand.Parameters.Add("@subquery", SqlDbType.VarChar).Value = subquery;
//subquery = "WHERE param1 IN ('A', 'Z') AND param2 <> param3" (for example...)
当然不行!查询是动态的,子查询是由特殊函数生成的。 最好的决定是什么?
【问题讨论】:
【参考方案1】:参数用于值,而不用于语句(或语句片段)。
A
和 Z
是可以放入参数中的值(比如说@value1
和@value2
)(我们将忽略使用可变数量的参数执行IN
运算符的复杂性... SQL Server 中的参数数量有硬性限制,2100)。所以例如WHERE param1 IN (@value1, @value2)
完全没问题...
您不能将整个WHERE param1 IN (@value1, @value2)
放在一个参数中。
你不应该/绝不能让用户编写 SQL 语句或一段 SQL 语句(所以不要由用户编写 SELECT
或 WHERE
),这是非常不安全的,我不'认为它不能真正得到保护。
即使让用户填写要选择的列的名称也是不安全的。经常问自己:如果用户写入列名会发生什么?
-- DROP TABLE SomeTable --
甚至让用户从“封闭列表”中选择列名也可能是不安全的,因为 10 次中有 9 次您不会检查用户是否操纵页面的 javascript 以在组合框中写入他想要的任何内容/listbox(很简单……在 Chrome 上按 F12,页面的整个 javascript 就在你手中)。
【讨论】:
以上是关于如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?的主要内容,如果未能解决你的问题,请参考以下文章
为啥自定义子查询类型不能分配给 GraphQLObjectType?
如何将自定义子视图的宽度设置为没有宽度限制的父 UIView 的 1/3?