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

Posted

技术标签:

【中文标题】VBScript 创建一个多维数组并添加到它?【英文标题】:VBScript create a multi-dimensional array and add to it? 【发布时间】:2013-11-22 05:30:42 【问题描述】:

这对我来说真是太棒了哈哈,我几乎检查了 Google 搜索上的几乎每个页面,但我仍然不知道该怎么做。

我想在 VB 脚本中创建一个名为 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

基本上,我正在尝试学习如何在 VB 脚本中创建多维数组并通过循环添加到其中。有哪些基本示例适用于我的情况?

【问题讨论】:

请不要再使用VBScript了。它的支持于 2002 年正式结束。 【参考方案1】:

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

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

Dim aFix(2, 3)

它们无法调整大小。 动态数组可以通过ReDim [Preserve] 更改。创建这样一个数组的最佳方法是

ReDim aDyn(2, 3)

如果您知道起始尺寸,或者

Dim aDyn : aDyn = Array()

如果你想从一个空的开始。要点 22 是:您只能对最后一个维度使用 Preserve。

(3) 你的

Dim data2()

是一个可憎的 - 一个没有大小的固定数组。可惜‘编译器’太笨了,无法捕捉到VBScript无法正确处理的野兽:

>> Dim data2()
>> WScript.Echo UBound(data2)
>>
Error Number:       9
Error Description:  Subscript out of range

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

更新 wrt jmbpiano 的评论:

(1) 我提供的证据表明,你不能得到用 () 调暗的变量的 UBound,所以我坚持我的说法,即这样的野兽是可憎的。看看问题(或this one)就知道使用()会给你带来麻烦。

(2) 我说过你应该使用ReDim a(KnownUbound) 来“声明”一个已知大小的动态数组,但我没有提供证据证明这个习语的“选项显式”兼容性。所以:

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)

输出:

cscript 19888987.vbs
qed

【讨论】:

"第 22 个问题是:您只能对最后一个维度使用 Preserve";您可以使用动态数组的动态数组来克服这一点,但更难在代码中保持干净并从以下位置提取数据:a = array(array(1,2,3),array(4,5),array(6,7,8,9)) 现在您可以获取数据a(x)(y) 样式:a(2)(1) -&gt; displays 7 数组结构与javascript的结构前后一致。之后我需要 data2 在 javascript 函数中运行。为什么 GetRows 以这种方式组织数据? data2(0,1) 其中 0 是元素,1 是索引 @Quaking-Mess - 有一个 toArray 方法 (msdn.microsoft.com/en-us/library/8943ay3x%28v=vs.90%29.aspx),但它失去了结构。你不应该尝试混合语言。 我想我会尝试 AccessDB 一个用于 Microsoft Access 的 JavaScript 接口库。 "Dim data2()" 只是一个变量声明,指示变量的预期类型(动态数组而不是变量)。唯一的区别是您使用 ReDim 而不是赋值来初始化结果变量。 Dim/ReDim 语法可能有点尴尬(为什么 MS 没有在单个语句中包含关键字来声明具有显式初始维度的动态数组令人费解我),但它几乎不是“可憎”,如果您使用 Option Explicit(通常是一个好主意),则它是必需的。【参考方案2】:

这可能是题外话,但是在看到您的确切代码之后,您为什么不使用内置的 ADO 函数:GetRows()

    sub grabdata
        SQL_query = "SELECT * FROM MSAccess_table"
        Set rsData = conn.Execute(SQL_query)
        If Not rsData.EOF Then aData = rsData.GetRows()         
    end sub

这会将您的所有列 # 作为第一个索引,并将行(数据)作为第二个索引。

所以要遍历它,你会:

If IsArray(aData) Then
    For x = lBound(aData,2) to uBound(aData,2) 'loops through the rows
        Col1 = aData(0,x)
        Col2 = aData(1,x)
        Col3 = aData(2,x)
        Response.Write "Row #" & x+1 & "<br>"
        Response.Write "This is the data in Column1: " & Col1 & "<br>"
        Response.Write "This is the data in Column2: " & Col2 & "<br>"
        Response.Write "This is the data in Column3: " & Col3 & "<br>"
    Next
End If

*注意:默认情况下,行(和列)在数组中从 0 开始。

【讨论】:

【参考方案3】:
set rs = conn.execute(strQry)

arrRAY = rs.GetRows()

if isarray(arrRAY) then
  do stuff
end if

【讨论】:

以上是关于VBScript 创建一个多维数组并添加到它?的主要内容,如果未能解决你的问题,请参考以下文章

php多维数组计数重复值并添加对应值

在循环内将数组添加到多维数组

Mongoose 查找并创建多维数组

jQuery 创建多维数组

C# 中的多维数组列表或列表?

PHP使用array_push将元素添加到多维数组