Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 如何将WHERE子句设置为仅使用选中的复选框而不使用动态SQL对多个位列进行筛选?_C#_Sql_Asp.net_Checkbox_Sqldatasource - Fatal编程技术网

C# 如何将WHERE子句设置为仅使用选中的复选框而不使用动态SQL对多个位列进行筛选?

C# 如何将WHERE子句设置为仅使用选中的复选框而不使用动态SQL对多个位列进行筛选?,c#,sql,asp.net,checkbox,sqldatasource,C#,Sql,Asp.net,Checkbox,Sqldatasource,我试图使用带有SqlDataSource控件的复选框和参数筛选select语句的结果 问题是参数不能是未定义的,我只希望给定的任何参数在定义后等于“1”或“True”。在其他任何时候,它们都不应该在WHERE子句中使用(或者设置为类似“isnotnull”的值) 本质上,选中复选框时,WHERE子句应包含与该复选框相关联的参数,且参数值应为“1”(True),否则,如果复选框处于任何其他状态,“未选中”或“不确定”,WHERE子句不应包含该复选框的参数,或者,它应该被设置为本质上选择“1”(真)

我试图使用带有SqlDataSource控件的复选框和参数筛选select语句的结果

问题是参数不能是未定义的,我只希望给定的任何参数在定义后等于“1”或“True”。在其他任何时候,它们都不应该在WHERE子句中使用(或者设置为类似“isnotnull”的值)

本质上,选中复选框时,WHERE子句应包含与该复选框相关联的参数,且参数值应为“1”(True),否则,如果复选框处于任何其他状态,“未选中”或“不确定”,WHERE子句不应包含该复选框的参数,或者,它应该被设置为本质上选择“1”(真)或“0”(假)的某个值

我尝试过通过添加括号、添加“AND”和“OR”语句来处理WHERE子句,但我似乎无法理解。动态SQL可以很容易地解决这个问题,但维护它将是一场噩梦,这只是一种糟糕的做法

例如,假设您有以下数据集:

| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 1   | Row1          | 1         | 0         | 1         |
| 2   | Row2          | 1         | 1         | 1         |
| 3   | Row3          | 1         | 0         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| 5   | Row5          | 0         | 0         | 0         |
在我们的用户体验中,我们有3个复选框,数据中的每个“位字段”对应一个复选框

如果用户未选中任何复选框,则搜索结果应返回:

| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 1   | Row1          | 1         | 0         | 1         |
| 2   | Row2          | 1         | 1         | 1         |
| 3   | Row3          | 1         | 0         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| 5   | Row5          | 0         | 0         | 0         |
WHERE语句本质上应该没有参数,或者如果有参数,则类似于
,其中BitField1不为NULL,BitField2不为NULL,BitField3不为NULL

如果用户选中与“BitField2”关联的框,则结果应为:

| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
WHERE语句应该是
WHERE BitField2=1

如果用户选中与“BitField1”和“BitField2”关联的框,则结果应为:

| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
WHERE语句应该是
其中BitField1=1和BitField2=1

如果用户选中所有复选框,结果应为:

| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
| 4   | Row4          | 1         | 1         | 0         |
| ID  | Col1          | BitField1 | BitField2 | BitField3 |
| 2   | Row2          | 1         | 1         | 1         |
WHERE语句应该是
,其中BitField1=1、BitField2=1和BitField3=1

这是我不用动态SQL就能做到的吗?我使用的不是存储过程,而是标准的TSQL查询


非常感谢您的帮助。

如果未选中某个框,请将其参数值设置为
DBNull.value
。然后在
WHERE
子句中为每个

。。。而BitFieldX=ISNULL(@BitFieldX,[BitFieldX])…


这会产生使用1或其他任何位字段的效果,从而有效地否定该字段上的任何过滤器。

您所说的
位字段是什么意思?传统上,这意味着一个字节(或多字节)数量中的单个位,例如,
[Flags]
style
enum
中的单个位。如果能显示。通常的方法是使用
“var sql=SELECT*fromtablename,其中1=1”
然后,对于要添加的每个额外条件,使用
sql+=”和BitField1=@BitField1;“
等。但具体实现取决于您是否使用ORM等。很好!它工作得很好!非常感谢你,我花了一个多小时挠头,知道这是可以做到的,但就是想不出来。干杯