2013-11-10 2 views
4

Это сумасшедший для меня ха-ха, я почти проверял почти каждую страницу в Google Поиске, и я все еще не понимаю, как это сделать.VBScript создать многомерный массив и добавить к нему?

Я хочу создать многомерный массив в 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 скрипт и добавить это с петлей. Каковы некоторые основные примеры, которые могут работать в моем случае?

ответ

8

(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 

Update WRT jmbpiano комментарий:

(1) Я дал evidenc e, что вы не можете получить UBound для переменной dimmed with(), поэтому я придерживаюсь своего утверждения, что такие звери являются мерзостями. Просто посмотрите на вопрос (или 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 
+0

«Уловка 22: вы можете использовать« Сохранять только для последнего измерения »; вы можете преодолеть это с помощью динамического массива динамических массивов, но сложнее сохранить его в своем коде и извлечь данные из: 'a = array (array (1,2,3), array (4,5) , array (6,7,8,9)) 'Теперь вы можете получить данные' a (x) (y) 'style:' a (2) (1) -> показывает 7' – AutomatedChaos

+0

Структура массива возвращается на передний план к Javascript. Мне нужно, чтобы data2 выполнялся в javascript-функции после этого. Почему GetRows организует данные таким образом? data2 (0,1) где 0 - это элемент, а 1 - индекс –

+0

@ Quaking-Mess - существует метод toArray (http://msdn.microsoft.com/en-us/library/8943ay3x%28v=vs .90% 29.aspx), но он теряет структуру. Вы не должны пытаться смешивать языки. –

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
set rs = conn.execute(strQry) 

arrRAY = rs.GetRows() 

if isarray(arrRAY) then 
    do stuff 
end if 
Смежные вопросы