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

DataAdapter填充更新慢及新增行事务卡顿问题求助

数据填充/更新性能优化与事务新增行异常问题

一、15000行200列表格的填充/更新性能优化

问题场景

使用以下代码处理15000行、200列的数据时,耗时约8分钟甚至卡顿;后续改用绑定数据源的方式,时间主要消耗在DataGridView1.DataSource = My_BindingSource步骤:

TableDataAdapter.update(DataTable)
TableDataAdapter.Fill(Datatable)
Dim My_Trans as SQLTransaction
Dim My_Table as new DataTable
Dim My_SQLDataAdapter as new SqlDataAdapter
Dim My_BindingSource as new BindingSource

conn.Open()
My_Trans = conn.BeginTransaction()

myqry = "Select * From My_Table"
My_SQLDataAdapter = New SqlDataAdapter(myqry, conn)

Try
    My_SQLDataAdapter.SelectCommand.Transaction = My_Trans
    My_BindingSource.DataSource = My_Table
    DataGridView1.DataSource = My_BindingSource    '(<----- here is take long time)

    My_Trans.Commit()
Catch ex As Exception
    My_Trans.Rollback()
End Try
conn.Close()

优化建议

  • 避免全量查询:不要使用SELECT *,仅查询DataGridView需要展示的列,减少数据传输量与内存占用。
  • 分页加载:无需一次性展示所有数据时,实现分页逻辑,每次仅加载当前页的几百条数据,大幅降低UI绑定耗时。
  • 关闭DataGridView非必要特性:绑定前设置DataGridView1.AutoGenerateColumns = False(手动配置列),临时关闭EnableHeadersVisualStyles、RowHeadersVisible等视觉效果,绑定完成后再恢复。
  • 批量更新配置:设置TableDataAdapter.UpdateBatchSize = 1000(根据数据库性能调整值),将逐行更新改为批量更新,减少数据库交互次数;同时事务仅包裹数据库操作,不要包含UI绑定步骤。
  • 异步加载数据:用Async/Await或后台线程填充DataTable,避免UI线程阻塞,填充完成后再切换回UI线程绑定数据源。
  • 优化DataTable加载:填充前调用DataTable.BeginLoadData(),填充完成后调用DataTable.EndLoadData(),关闭自动索引与约束检查,提升加载速度。

二、事务处理中新增行卡顿无报错的原因分析

问题场景

自定义TableAdapter事务方法后,修改/删除行正常,但新增行时卡顿且无任何报错信息:

Namespace DataSet1TableAdapters
    Partial Public Class Table1TableAdapter
        Public Function CreartTransaction() As Data.IDbTransaction
        Try
            Dim cmd As SqlCommand
            Dim oConnection = me.CommandCollection(0).Connection
                if oConnection.State = ConnectionState.Open 
                    Else
                   oConnection.Open()
                End If
            Dim oTrans As SqlTransaction = oConnection.BeginTransaction()
            For Each cmd In me.CommandCollection
                cmd.Connection = oConnection
                cmd.Transaction = oTrans
            Next
        Return oTrans
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
        End Function
    End Class
End Namespace
Dim oTrans As SqlTransaction = Table1TableAdapter.CreartTransaction
me.Table1TableAdapter.Transaction = oTrans
try
    me.Table1TableAdapter.Update(me.DataSet1.Table1) (<----- Here when Have new rows not work and stop process without any error message)
    oTrans.Commit
Catch ex As Exception
    oTrans.Rollback
End Try

原因分析

  1. 主键/约束冲突:若表存在自增主键,InsertCommand可能未正确配置获取自增ID的逻辑,导致数据库端等待或隐性主键冲突;检查InsertCommand是否设置ReturnValue获取自增值,或是否存在重复键值。
  2. 事务绑定遗漏:遍历CommandCollection时,可能漏掉了InsertCommand(比如手动添加的InsertCommand未加入集合),导致新增操作未关联事务,与其他操作产生锁冲突引发阻塞。
  3. 连接资源异常:CreartTransaction方法中,打开连接后未处理连接被占用的情况;新增行时可能因连接资源不足导致操作阻塞。
  4. 异常捕获疏漏:新增行可能抛出异常,但被TableAdapter内部吞掉或UI线程阻塞导致未触发Catch块;可设置TableAdapter.ContinueUpdateOnError = False强制抛出异常,或通过DataTable.GetErrors()查看行级错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:40:12