VB.NET使用OR语句查询数据库,选择少于6个条件无数据返回
问题分析
你的核心问题在于硬编码了6个查询参数:当用户选择的条件少于6个时,list2的元素数量不足,直接访问list2(3)、list2(4)、list2(5)要么会抛出索引越界异常,要么会把空值传入参数,导致SQL查询无法匹配到任何数据,最终DataGridView没有内容。哪怕换成IN语句,如果还是硬传6个参数(其中部分为空),同样会因为空值不符合kode列的实际值(kriteria1到kriteria6),导致查询返回空结果。
解决方案:动态构建查询与参数
我们需要根据用户实际选择的条件数量,动态生成SQL语句和对应的参数,同时完善DataGridView的矩阵构建(不仅要加列,还要添加对应行)。
以下是修改后的完整代码:
Private Sub perhitungankriteria_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 先清空集合,避免重复加载 list2.Clear() For Each item In menuuser.ListBox2.Items list2.Add(item.ToString()) ' 确保转成字符串类型,避免类型不匹配 Next ' 前置校验:判断选择数量是否符合3-6个的要求 If list2.Count < 3 Or list2.Count > 6 Then MessageBox.Show("请选择3-6个条件!") DataGridView1.Columns.Clear() DataGridView1.Rows.Clear() Return End If connect() End Sub Sub connect() ' 清空之前的缓存和DataGridView内容 list.Clear() DataGridView1.Columns.Clear() DataGridView1.Rows.Clear() Dim cmd As OleDbCommand = New OleDbCommand() cmd.Connection = konek ' 动态构建IN子句的参数占位符 Dim paramPlaceholders As New List(Of String)() For i As Integer = 0 To list2.Count - 1 paramPlaceholders.Add($"@kriteria{i}") cmd.Parameters.Add($"@kriteria{i}", OleDbType.VarChar, 50).Value = list2(i) Next ' 拼接最终的SQL查询语句 cmd.CommandText = $"SELECT kode FROM kriteria WHERE kode IN ({String.Join(", ", paramPlaceholders)})" ' 执行查询并读取数据,用Using自动释放资源 Using adapter As OleDbDataReader = cmd.ExecuteReader() While adapter.Read() Dim kode As String = adapter("kode").ToString() list.Add(kode) ' 添加矩阵的列 DataGridView1.Columns.Add(kode, kode) End While End Using ' 添加矩阵的行,确保行列对应选中的条件,形成N×N矩阵 For Each kode As String In list DataGridView1.Rows.Add(kode) Next End Sub
关键改进点
- 动态参数构建:根据
list2的实际元素数量生成对应数量的参数占位符,彻底解决了硬编码6个参数导致的索引越界或空值问题。 - 前置校验:在加载时先判断选择的条件数量是否合规,提前给出提示并清空DataGridView,避免无效查询。
- 完善矩阵结构:之前只添加了列,现在同时添加对应行,确保矩阵的行列都对应选中的条件,真正形成N×N的矩阵(N为选择的条件数量)。
- 资源安全:使用
Using语句包裹DataReader,确保资源自动释放,避免内存泄漏。
额外提示
如果list和list2是类级别的集合,记得在每次加载时先清空,避免重复添加数据导致的异常。
内容的提问来源于stack exchange,提问作者Original Custom
相关产品推荐
相关产品推荐

