(1) ADO 結果セットを 2 次元配列に取得する最良の方法は、.GetRowsメソッドを使用することです。その後、問題は消えます。
(2) VBScript には 2 種類の配列があります。固定配列は、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」互換性については証拠を示しませんでした。そう :
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