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

将数据集内容保存到变体数组: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:00:25