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

VB.Net+Access单实例应用部分表更新出现并发冲突问题求助

解决VB.Net+Access强类型DataSet更新时的并发冲突错误

问题场景

使用VB.Net搭配MS Access本地数据库,通过向导生成强类型DataSet和数据绑定控件,单用户单实例程序。部分表在添加新记录后立即修改并保存时,触发错误:Concurrency violation: the UpdateCommand affected 0 of the expected 1 records,但添加记录正常,且部分表无此问题。

核心原因

即使是单用户,UpdateCommand无法定位到要修改的记录,通常是以下原因:

  • 表未设置主键,导致UpdateCommand无法唯一识别记录
  • 启用了开放式并发检查,且插入后DataSet中部分字段值与数据库实际值不一致(比如自动编号字段)
  • TableAdapter的UpdateCommand逻辑错误,WHERE子句包含了已变化的字段

解决步骤

1. 检查目标表的主键设置

Access表必须有主键(建议用自动编号类型的ID字段),否则TableAdapter无法生成能准确定位记录的UpdateCommand。

  • 打开Access数据库,找到出问题的表,确认是否已设置主键。如果没有,添加一个自动编号字段并设为主键。

2. 调整TableAdapter的并发设置

打开DataSet设计器,找到对应问题表的TableAdapter:

  • 右键点击TableAdapter → 选择配置
  • 在向导中进入高级选项
  • 取消勾选使用开放式并发(单用户场景无需并发检查)
  • 勾选刷新数据集(确保插入后数据库生成的自动编号等字段值同步回DataSet)
  • 完成配置,重新生成TableAdapter的命令

3. 手动修正UpdateCommand(可选)

如果向导生成的UpdateCommand仍有问题,可直接修改其SQL语句:

  • 在DataSet设计器中,选中TableAdapter的UpdateCommand
  • 在属性窗口中修改CommandText,确保WHERE子句仅使用主键字段定位记录,示例:
    UPDATE Invoices 
    SET InvoiceNo = ?, Amount = ?, InvoiceDate = ? 
    WHERE ID = ?
    
    避免在WHERE子句中包含其他可能变化的字段(如自动生成的时间戳、自动编号等)

4. 确保插入后DataSet字段同步

如果自动编号字段在插入后未同步到DataSet,可在保存后手动刷新数据:
修改保存按钮的代码,在UpdateAll后重新Fill数据表:

Private Sub InvoicesBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InvoicesBindingNavigatorSaveItem.Click
    Me.Validate()
    Me.InvoicesBindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.CA_OfficeDataSet)
    ' 添加以下代码,刷新当前数据表
    Me.InvoicesTableAdapter.Fill(Me.CA_OfficeDataSet.Invoices)
    ' 定位回刚修改的记录(可选)
    Dim currentId = CType(InvoicesBindingSource.Current, DataRowView)("ID")
    InvoicesBindingSource.Position = InvoicesBindingSource.Find("ID", currentId)
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:52:12