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脚本中创建一个多维数组并使用循环添加它.在我的案例中可以使用哪些基本示例?
(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)