4

これは私にとって大変なことです(笑)、Google 検索のほぼすべてのページをほぼチェックしましたが、まだその方法を静かに理解していません。

data2 という VB スクリプトで多次元配列を作成したいと考えています。私が見た例を試してみましたが、「添え字が範囲外です」というエラーが表示されました

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 スクリプトで多次元配列を作成し、ループで追加する方法を学ぼうとしています。私の場合に機能する基本的な例は何ですか?

4

3 に答える 3

9

(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
于 2013-11-10T11:46:51.577 に答える
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

これにより、すべての列 # が最初のインデックスとして返され、行 (データ) が 2 番目のインデックスとして返されます。

したがって、それをループするには、次のようにします。

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 から始まります。

于 2014-01-15T18:44:54.470 に答える
-3
set rs = conn.execute(strQry)

arrRAY = rs.GetRows()

if isarray(arrRAY) then
  do stuff
end if
于 2015-09-15T19:18:34.207 に答える