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

VB.NET TableAdapter查询失败保留Typed DataTable旧数据及替换表报错问题

强类型DataSet TableAdapter刷新失败保留旧数据的解决方案

报错原因

你的代码触发空参数报错有两个核心诱因:

  • 当数据库访问异常时,GetData()方法会直接抛出异常,TempTbl不会被正常赋值,保持默认的Nothing(即Null),后续执行Tables.Add(TempTbl)时就会触发空参数错误
  • 强类型DataSet的表属性是绑定固定实例的,你移除原有表后,DSi_ERecord.DT_spRefreshAndSelectStepConnectorMonitor会被置空,后续依赖该属性的逻辑都会触发空引用错误,同时原有绑定到该表的UI控件也会直接断连

可行实现方案

不要直接替换表实例,先拉取新数据确认无误后再更新原有表的数据,原有表实例全程保留,一旦拉取失败完全不影响旧数据:

Try
    ' 仅先尝试拉取新数据,不修改原有表的任何内容
    Dim TempTbl As DS_ERecord.DT_spRefreshAndSelectStepConnectorMonitorDataTable
    TempTbl = TAi_spRefreshAndSelectStepConnectorMonitor.GetData(ForceRefresh, CmbMonitorView.SelectedValue)
    
    ' 拉取成功后再更新原有表数据
    If TempTbl IsNot Nothing Then
        DSi_ERecord.DT_spRefreshAndSelectStepConnectorMonitor.Clear()
        DSi_ERecord.DT_spRefreshAndSelectStepConnectorMonitor.Merge(TempTbl)
        ' 若不需要跟踪行变更可调用AcceptChanges
        DSi_ERecord.DT_spRefreshAndSelectStepConnectorMonitor.AcceptChanges()
    End If
Catch ex As Exception
    ' 此处可添加异常提示逻辑,原有表数据不会被修改
    MessageBox.Show($"数据刷新失败:{ex.Message},将保留原有展示内容")
End Try

方案优势

  • 所有数据库操作放在异常捕获块内,只要拉取失败就不会触动原有表的任何数据,完美实现旧数据保留的需求
  • 不修改原有强类型表的实例,所有绑定到该表的控件、业务逻辑都不需要调整,不会出现断连或空引用问题
  • 不需要修改TableAdapter的原有配置,也不需要处理表移除/添加的各类兼容问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:45:02