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
相关产品推荐
相关产品推荐

