VBScript创建一个多维数组并添加到它?

Qua*_*ess 4 vbscript loops multidimensional-array

这对我来说很糟糕哈哈,我几乎检查过谷歌搜索的每一页,我仍然不清楚如何去做.

我想在VB Script中创建一个名为data2的多维数组.尝试我见过的例子,但是我收到了"下标超出范围"的错误

Dim data2()

sub grabdata
    SQL_query = "SELECT * FROM MSAccess_table"
    Set rsData = conn.Execute(SQL_query)
    Do Until rsData.EOF = True
        ReDim Preserve data2(UBound(data2) + 1)
        data2(UBound(data2)) = Array(rsData("id"),rsData("column_1"),rsData("column_2"),rsData("column_3"),rsData("column_4"))
    rsData.moveNext 
    Loop
end sub
Run Code Online (Sandbox Code Playgroud)

基本上我正在尝试学习如何在VB脚本中创建一个多维数组并使用循环添加它.在我的案例中可以使用哪些基本示例?

Ekk*_*ner 9

(1)将ADO结果集转换为二维数组的最佳方法是使用.GetRows方法.然后你的问题就消失了.

(2)VBScript中有两种数组.通过指定UBounds来声明固定数组:

Dim aFix(2, 3)
Run Code Online (Sandbox Code Playgroud)

它们无法调整大小.动态数组可以改变ReDim [Preserve].创建这样一个数组的最好方法是

ReDim aDyn(2, 3)
Run Code Online (Sandbox Code Playgroud)

如果你知道起始大小,或者

Dim aDyn : aDyn = Array()
Run Code Online (Sandbox Code Playgroud)

如果你想从一个空的开始.catch 22是:您只能将Preserve用于最后一个维度.

(3)你的

Dim data2()
Run Code Online (Sandbox Code Playgroud)

是一种憎恶 - 一个没有大小的固定数组.遗憾的是,'编译器'太愚蠢了,无法捕捉到VBScript无法正常处理的野兽:

>> Dim data2()
>> WScript.Echo UBound(data2)
>>
Error Number:       9
Error Description:  Subscript out of range
Run Code Online (Sandbox Code Playgroud)

Dim a()声明的肮脏被以下事实隐藏:稍后ReDim将在该变量中存储适当的动态数组:

>> Dim data2() ' <-- abomination
>> ReDim data2(1,1) ' <-- overwritten by a dynamic array
>> data2(0,0) = 0
>> ReDim Preserve data2(1,5) ' last dimension increased; 'old' data preserved
>> data2(1,5) = 1
>> WScript.Echo data2(0,0), data2(1,5)
>>
0 1
Run Code Online (Sandbox Code Playgroud)

更新wrt jmbpiano的评论:

(1)我提供了证据证明你不能得到UBound变量变暗(),所以我坚持认为这些野兽是可憎的.只要看看问题(或者这个问题),看看使用()会给你带来麻烦.

(2)我说你应该用ReDim a(KnownUbound)'声明'一个已知大小的动态数组,但我没有证明这个成语的'Option Explicit'兼容性.所以:

Option Explicit
ReDim a(4711)
ReDim b(4,7,1,1)
a(0) = "qed"
b(0,0,0,0) = "qed"
WScript.Echo b(0,0,0,0)
Run Code Online (Sandbox Code Playgroud)

输出:

cscript 19888987.vbs
qed
Run Code Online (Sandbox Code Playgroud)