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

