这对我来说真是太糟糕了哈哈,我几乎检查了Google搜索的每一页,我仍然不清楚如何理解。
我想在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
基本上我正在尝试学习如何在VB脚本中创建一个多维数组并用循环添加它。在我的案例中可以使用哪些基本示例?
答案 0 :(得分:9)
(1)将ADO结果集转换为二维数组的最佳方法是使用.GetRows方法。然后你的问题就消失了。
(2)VBScript中有两种数组。通过指定UBounds来声明固定数组:
Dim aFix(2, 3)
它们无法调整大小。 动态数组可以由ReDim [Preserve]
更改。创建这样一个数组的最佳方法是
ReDim aDyn(2, 3)
如果您知道起始尺寸,或
Dim aDyn : aDyn = Array()
如果你想从一个空的开始。 catch 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'兼容性的证据。所以:
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
答案 1 :(得分:1)
这可能是偏离主题的,但在看到您的确切代码后,为什么不使用内置的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开始。
答案 2 :(得分:-2)
set rs = conn.execute(strQry)
arrRAY = rs.GetRows()
if isarray(arrRAY) then
do stuff
end if