C# 如何将WHERE子句设置为仅使用选中的复选框而不使用动态SQL对多个位列进行筛选?
我试图使用带有SqlDataSource控件的复选框和参数筛选select语句的结果 问题是参数不能是未定义的,我只希望给定的任何参数在定义后等于“1”或“True”。在其他任何时候,它们都不应该在WHERE子句中使用(或者设置为类似“isnotnull”的值) 本质上,选中复选框时,WHERE子句应包含与该复选框相关联的参数,且参数值应为“1”(True),否则,如果复选框处于任何其他状态,“未选中”或“不确定”,WHERE子句不应包含该复选框的参数,或者,它应该被设置为本质上选择“1”(真)或“0”(假)的某个值 我尝试过通过添加括号、添加“AND”和“OR”语句来处理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”(真)
| 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]
styleenum
中的单个位。如果能显示。通常的方法是使用“var sql=SELECT*fromtablename,其中1=1”
然后,对于要添加的每个额外条件,使用sql+=”和BitField1=@BitField1;“
等。但具体实现取决于您是否使用ORM等。很好!它工作得很好!非常感谢你,我花了一个多小时挠头,知道这是可以做到的,但就是想不出来。干杯