使用jQuery Select2多选下拉框实现GridView多条件筛选的代码问题
多Select2下拉框筛选GridView的代码修复方案
问题根因
你当前的拼接逻辑只给第一个筛选条件加了WHERE关键字,如果用户未选中第一个下拉框(客户名称)的选项,只选中第二个下拉框(账号)的选项,最终拼接的SQL会出现表名后直接接AND的语法错误,导致查询失败。同时还存在空值未过滤的问题,隐藏域为空时拆分出来的空字符串会生成无效的查询条件。
修复后的代码
只需要修改OnSearch方法即可,代码如下:
Protected Sub OnSearch(ByVal sender As Object, ByVal e As EventArgs) Dim query As String = " SELECT distinct([CUSTOMER_NAME_CMT]),[Acc Number] FROM dbo.MASTERDATA_PRO" ' 用列表存储所有生效的筛选条件 Dim conditions As New List(Of String)() ' 处理客户名称筛选条件 If Not String.IsNullOrWhiteSpace(hfSelected.Value) Then Dim customerItems = hfSelected.Value.Split(","c).Where(Function(s) Not String.IsNullOrWhiteSpace(s)).ToList() If customerItems.Any() Then Dim customerCondition = String.Join(",", customerItems.Select(Function(s) $"'{s.Replace("'", "''")}'")) conditions.Add($" CUSTOMER_NAME_CMT IN ({customerCondition}) ") End If End If ' 处理账号筛选条件 If Not String.IsNullOrWhiteSpace(hfSelected_ACCNO.Value) Then Dim accItems = hfSelected_ACCNO.Value.Split(","c).Where(Function(s) Not String.IsNullOrWhiteSpace(s)).ToList() If accItems.Any() Then Dim accCondition = String.Join(",", accItems.Select(Function(s) $"'{s.Replace("'", "''")}'")) conditions.Add($" [Acc Number] IN ({accCondition}) ") End If End If ' 统一拼接WHERE条件 If conditions.Any() Then query &= " WHERE " & String.Join(" AND ", conditions) End If GridView1.DataSource = GetData(query) GridView1.DataBind() End Sub
逻辑说明
- 请确保前端第二个Select2下拉框的选中值已经按照第一个下拉的逻辑,正确同步到
hfSelected_ACCNO隐藏域中 - 先把所有生效的筛选条件都存入
List集合,不需要单独处理每个条件的前缀关键字 - 过滤了隐藏域为空、拆分后出现空字符串的异常场景
- 加了单引号转义逻辑,避免用户输入的内容带单引号导致SQL语法错误
- 最后统一判断是否有筛选条件,有就拼接
WHERE,再把所有条件用AND拼接,完全避免语法错误
优化建议
当前拼接SQL字符串的方式存在SQL注入风险,生产环境建议改成参数化查询,把IN子句的每个值都作为参数传入,不要直接拼接用户输入的内容。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

