将数据集内容保存到变体数组:VBA与VB.NET实现对比
VB.NET 实现类似VBA ADO GetRows的功能
在VBA中通过GetRows可以直接将Access表数据存入无需指定维度的变体数组,在VB.NET中可以通过以下两种方式实现相同效果:
方式一:用OleDbDataReader直接生成数组(贴近VBA逻辑)
这种方式无需DataSet,直接读取数据并生成和VBAGetRows结构一致的列优先二维对象数组:
Imports System.Data.OleDb ' 核心代码 Dim connString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={sourceFld}{dbFileName};Persist Security Info=False;" Dim queryString As String = "SELECT * FROM [TableName]" Dim outputArr As Object(,) ' 对应VBA的Variant数组 Using rsCon As New OleDbConnection(connString) rsCon.Open() Using cmd As New OleDbCommand(queryString, rsCon) Using reader As OleDbDataReader = cmd.ExecuteReader() If reader.HasRows Then Dim colCount As Integer = reader.FieldCount Dim tempRows As New List(Of Object()) ' 逐行读取数据到临时列表 While reader.Read() Dim currentRow(colCount - 1) As Object reader.GetValues(currentRow) tempRows.Add(currentRow) End While ' 转换为列优先的二维数组(和VBA GetRows结构一致) outputArr = New Object(colCount - 1, tempRows.Count - 1) {} For colIdx As Integer = 0 To colCount - 1 For rowIdx As Integer = 0 To tempRows.Count - 1 outputArr(colIdx, rowIdx) = tempRows(rowIdx)(colIdx) Next Next End If End Using End Using End Using
方式二:从DataSet/DataTable转换为数组
如果你已经使用DataSet填充了数据,可以直接从DataTable转换为目标数组:
' 承接你原有的代码,填充DataSet之后 Dim outputArr As Object(,) = Nothing If dtSet.Tables.Count > 0 Then Dim targetTable As DataTable = dtSet.Tables(0) Dim colCount As Integer = targetTable.Columns.Count Dim rowCount As Integer = targetTable.Rows.Count outputArr = New Object(colCount - 1, rowCount - 1) {} ' 按列优先填充数组,对齐VBA GetRows的结构 For colIdx As Integer = 0 To colCount - 1 For rowIdx As Integer = 0 To rowCount - 1 outputArr(colIdx, rowIdx) = targetTable.Rows(rowIdx)(colIdx) Next Next End If
关键注意点
- VB.NET中没有VBA的
Variant类型,使用Object类型替代,二维Object(,)数组可以存储不同类型的数据,和VBA变体数组功能一致 - VBA的
GetRows返回列优先的数组(第一维是列索引,第二维是行索引),上述代码保持了这一结构,确保和VBA输出逻辑对齐 - 原代码中
Dim Y() As Array是错误写法,Array是类型而非存储容器,需要使用Object(,)二维数组 - 使用
Using语句可以自动释放数据库连接、命令等资源,比手动调用Close更安全可靠
内容的提问来源于stack exchange,提问作者Stefan Liiceanu
相关产品推荐
相关产品推荐

