Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建动态的、用户生成的查询,不限制SQL中的参数_C#_Sql_Asp.net_Sql Server_Tsql - Fatal编程技术网

C# 创建动态的、用户生成的查询,不限制SQL中的参数

C# 创建动态的、用户生成的查询,不限制SQL中的参数,c#,sql,asp.net,sql-server,tsql,C#,Sql,Asp.net,Sql Server,Tsql,我有一个asp.net页面,允许用户通过生成要包含在存储过程中的where子句来搜索数据库。问题在于,该程序必须考虑各种条件下的未知数量的参数。一个过于简化的示例可能如下所示: SELECT [Column1] FROM [TableName] WHERE 1=1 --Everything below user generated AND ( ([Column2] = '1' AND [Column3] = '5' AND [Column4] = '9') OR ([Column2]

我有一个asp.net页面,允许用户通过生成要包含在存储过程中的where子句来搜索数据库。问题在于,该程序必须考虑各种条件下的未知数量的参数。一个过于简化的示例可能如下所示:

SELECT [Column1] FROM [TableName] WHERE 1=1
--Everything below user generated
AND
(
   ([Column2] = '1' AND [Column3] = '5' AND [Column4] = '9') OR
   ([Column2] = '2' AND [Column3] = '6' AND [Column4] = '8') OR
   ...
   ([Column2] = '25' AND [Column3] = '3' AND [Column4] = '1')
)
AND [Column5] BETWEEN '10' AND '200'

我想知道最好的解决办法是什么。我知道我可以将where子句构建为一个字符串,并将其作为一个大参数传递给存储过程,然后将lot作为动态sql执行,但有什么更好的解决方案呢?

首先,存储过程是一个优化的/上下文化的执行计划


您想要的是对您操作的列、运算符没有限制(=,比如,看看LINQ怎么样?如果它真的是动态的,那么仅仅使用动态SQL而不使用存储过程不是更容易吗?@JamesZ查询的这部分是一个更大的预先存在的存储过程的一部分,它在其他几个地方被引用。将该过程执行到一个表中。从表中选择并添加where动态sql中的子句。您知道sql注入攻击是什么吗?如果您的“用户生成”部分确实是由用户提供的,并且未正确清理,则这是一个巨大的安全漏洞