VB.NET 点击刷新按钮刷新MS Access绑定DataGridView时数据重复问题求助
数据重复翻倍问题根因
- 全局声明的
DataSet未在每次刷新前清空缓存数据,OleDbDataAdapter.Fill方法在目标表已存在时,默认会向表中追加查询到的全量数据,而非替换原有内容,每点击一次刷新就会把SWOT表的全量数据重复写入一次,最终数据量线性翻倍。 - 绑定数据源时使用
tables(0)索引匹配表,而非实际填充的SWOT_Report表名,存在表顺序错位、绑定异常的潜在风险。
可直接运行的修复代码
Private Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click Refreshdata() End Sub ' 集中管理连接字符串,后续数据库路径调整时只需要修改此处 Private ReadOnly connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\ahmed\OneDrive\Desktop\ProjectDatabase2003.mdb" Private DS As New DataSet() Private source1 As New BindingSource() Private Sub Refreshdata() ' 核心修复:清空原有缓存数据,避免Fill追加重复内容 DS.Clear() ' Using块自动释放数据库连接资源,避免连接泄漏 Using DA As New OleDbDataAdapter("SELECT * FROM SWOT", New OleDbConnection(connString)) DA.Fill(DS, "SWOT_Report") ' 按表名获取对应DataView,避免索引错位 Dim view1 As New DataView(DS.Tables("SWOT_Report")) source1.DataSource = view1 DataGridView1.DataSource = source1 DataGridView1.Refresh() End Using End Sub
核心改动说明
- 每次刷新第一步先调用
DS.Clear()清空DataSet内所有缓存,Fill时会重新创建目标表,从逻辑上彻底杜绝重复追加数据的问题。 - 把数据适配器、数据库连接实例放在
Using块内,操作完成后自动释放连接资源,避免长期运行出现数据库连接被占用的异常。 - 改用表名
DS.Tables("SWOT_Report")获取对应数据表生成DataView,替代原有的索引取值写法,不会因为DataSet内表顺序变动导致绑定错误。 - 直接将
BindingSource作为DataGridView的绑定源,后续如果需要做数据过滤、排序操作,可直接操作source1对象,无需重复重置GridView的绑定逻辑。
小提示:如果后续Access数据库文件路径调整,只需要修改
connString常量内的路径值即可,无需改动其余业务逻辑代码。
内容的提问来源于stack exchange,提问作者Ahmed。
相关产品推荐
相关产品推荐

