如何将自定义子查询传递给 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】:

参数用于值,而不用于语句(或语句片段)。

AZ 是可以放入参数中的值(比如说@value1@value2)(我们将忽略使用可变数量的参数执行IN 运算符的复杂性... SQL Server 中的参数数量有硬性限制,2100)。所以例如WHERE param1 IN (@value1, @value2) 完全没问题...

您不能将整个WHERE param1 IN (@value1, @value2) 放在一个参数中。

你不应该/绝不能让用户编写 SQL 语句或一段 SQL 语句(所以不要由用户编写 SELECTWHERE),这是非常不安全的,我不'认为它不能真正得到保护。

即使让用户填写要选择的列的名称也是不安全的。经常问自己:如果用户写入列名会发生什么?

-- DROP TABLE SomeTable --

甚至让用户从“封闭列表”中选择列名也可能是不安全的,因为 10 次中有 9 次您不会检查用户是否操纵页面的 javascript 以在组合框中写入他想要的任何内容/listbox(很简单……在 Chrome 上按 F12,页面的整个 javascript 就在你手中)。

【讨论】:

以上是关于如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?的主要内容,如果未能解决你的问题,请参考以下文章

为啥自定义子查询类型不能分配给 GraphQLObjectType?

如何将 UIView 插座连接到自定义子视图

如何将自定义子视图的宽度设置为没有宽度限制的父 UIView 的 1/3?

如何在 ADO.NET 源 SSIS 中传递参数

SwiftUI GeometryReader 不会在中心布局自定义子视图

如何将参数传递给 ssis 中的 ado.net 源?