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

VB.NET中DataTables无法合并问题求助

问题分析与修复方案:DataTable合并失败导致多查询结果无法显示

看起来你遇到的核心问题是全局复用同一个dt_TempTable导致合并操作无法累加多轮查询结果,我来帮你拆解问题并给出修复后的代码。

问题根源

你的dt_TempTable是全局变量,每次调用Retrieveinfo方法时,tblAdapt.GetData(dt_TempTable, ...)会清空这个表的原有数据,然后填充当前查询的结果。当循环执行到第2次及以后时,你合并的其实是被新数据覆盖后的dt_TempTable,而不是之前查询的独立结果,最终就只会显示最后一次查询的数据。

另外,第一次赋值dt_ContentsTable = Retrieveinfo(...)后,后续合并逻辑依赖全局dt_TempTable的状态,这也会导致数据覆盖的问题。

修复后的代码

Option Strict On
Dim dt_ContentsTable As New DataTable
Dim SerialNumbers As New List(Of String)
Dim PanelIDs As New List(Of String)
Dim MultiSearch As Boolean

Private Sub bgwk_data_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwk_data.DoWork
    If Not (MultiSearch) Then
        dt_ContentsTable = Retrieveinfo(Me.txt_SerialNumber.Text, Me.txt_PanelID.Text)
    Else
        Dim arrSN As String() = SerialNumbers.ToArray()
        Dim arrPID As String() = PanelIDs.ToArray()
        ' 初始化结果表为空,确保结构正确
        dt_ContentsTable = New DataTable()
        For i = 0 To arrSN.Count - 1
            Dim currentQueryResult = Retrieveinfo(arrSN(i), arrPID(i))
            If dt_ContentsTable.Rows.Count = 0 Then
                ' 第一次查询:复制结构和数据
                dt_ContentsTable = currentQueryResult.Copy()
            Else
                ' 后续查询:合并新数据到结果表
                dt_ContentsTable.Merge(currentQueryResult)
            End If
        Next
    End If
End Sub

' Gets the Data by SerialNumber and saves it to a new temp table to be bound afterwards
Private Function Retrieveinfo(SerialNumber As String, PanelID As String) As DataTable
    ' 每次调用都创建新的临时表,避免数据覆盖
    Dim dt_TempTable As New DataTable
    Dim ds As New datasource
    Dim tblAdapt As New datasourceTableAdapters.toHTML_SPC_DataTableAdapter
    tblAdapt.GetData(dt_TempTable, SerialNumber, PanelID)
    Return dt_TempTable ' 返回当前查询的独立结果
End Function

' Updates dg_data with the datatable from Retrieveinfo and refreshes the form
Private Sub bgwk_dataRunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwk_data.RunWorkerCompleted
    ' Unlocks ability to search new things
    Me.txt_PanelID.ReadOnly = False
    Me.txt_SerialNumber.ReadOnly = False
    Me.dg_data.ReadOnly = False

    ' Binds the backgroundworker results to the datagridview
    Me.dg_data.DataSource = Nothing
    Me.dg_data.DataSource = dt_ContentsTable
    Me.dg_data.Refresh()
    Me.Refresh()
End Sub

关键修复点解释

  • 每次查询创建新的临时表:避免全局变量导致的数据覆盖,确保每轮查询的结果都是独立的DataTable。
  • 初始化结果表:在多查询模式下先清空dt_ContentsTable,避免残留之前的查询数据。
  • 使用Copy()初始化结果表:第一次查询时复制结构和数据,确保后续合并的表结构完全一致(Merge要求表结构匹配,否则可能丢失数据或报错)。

额外注意事项

  • 确保所有查询返回的DataTable结构完全一致(列名、数据类型、约束等),这是Merge方法正常工作的前提。
  • 如果你的GetData方法本身会修改传入的DataTable结构,建议在Retrieveinfo中先创建与目标结构一致的表,再填充数据。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:06:19