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

VB.NET中OleDbDataAdapter仅能填充一次DataTable问题求助

问题原因与解决方案:用Recordset填充两个DataTable仅第一个成功

问题原因

当使用OleDbDataAdapter.Fill()方法将ADODB.Recordset的数据填充到DataTable时,该方法会将Recordset的游标移动到结果集的末尾(EOF)。虽然你手动调用了rs1.MoveFirst(),但OleDbDataAdapter的Fill方法在处理Recordset时,内部逻辑会标记该Recordset已被读取完毕,后续即使重置游标,也无法再次通过Fill方法读取数据。

可行解决方案

方案1:复制Recordset实例

在第一次填充前,克隆一份Recordset,分别用于填充两个DataTable:

Dim da As New OleDb.OleDbDataAdapter
Dim dt1 As New DataTable
Dim rs1 As New ADODB.Recordset
rs1.Open("select * from table", conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)

' 克隆Recordset,保留数据和结构
Dim rs2 As ADODB.Recordset = rs1.Clone()
rs2.MoveFirst()

da.Fill(dt1, rs1)

da = New OleDb.OleDbDataAdapter
Dim dt2 As New DataTable
da.Fill(dt2, rs2)

方案2:直接复制已填充的DataTable

既然第一个DataTable已经成功获取数据,直接复制它的结构和数据是最简便的方式:

Dim da As New OleDb.OleDbDataAdapter
Dim dt1 As New DataTable
Dim rs1 As New ADODB.Recordset
rs1.Open("select * from table", conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)
da.Fill(dt1, rs1)

' 复制dt1的所有数据和结构到dt2
Dim dt2 As DataTable = dt1.Copy()

方案3:重新打开Recordset

如果允许再次执行查询,重新打开Recordset来填充第二个DataTable:

Dim da As New OleDb.OleDbDataAdapter
Dim dt1 As New DataTable
Dim rs1 As New ADODB.Recordset
rs1.Open("select * from table", conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)
da.Fill(dt1, rs1)
rs1.Close()

' 重新打开Recordset填充第二个表
da = New OleDb.OleDbDataAdapter
Dim dt2 As New DataTable
rs1.Open("select * from table", conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)
da.Fill(dt2, rs1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:41:17