You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:12:44