Классический ASP 3.0 Создание массива из набора записей - PullRequest
7 голосов
/ 30 декабря 2010

Я пытаюсь исправить приложение ASP Classic и когда я пытаюсь создать массив из объекта Recordset. Однако я не могу заставить его работать правильно.

Этот код дает мне одну запись (последнюю), но, насколько я вижу, она верна:

Dim Products
Dim Products_cmd
Dim Products_numRows

Set Products_cmd = Server.CreateObject ("ADODB.Command")
Products_cmd.ActiveConnection = Conn
Products_cmd.CommandText = "SELECT prod_id, prod_description FROM dbo.products ORDER BY prod_description ASC" 
Products_cmd.Prepared = true

Set Products = Products_cmd.Execute
Products_numRows = 0

Dim arrProducts()
arrProducts = Products.GetRows()

Использование этого кода дает мне «нижний индекс вне диапазона:« UBound »

Dim Products
Dim Products_cmd
Dim Products_numRows

Set Products_cmd = Server.CreateObject ("ADODB.Command")
Products_cmd.ActiveConnection = Conn
Products_cmd.CommandText = "SELECT prod_id, prod_description FROM dbo.products ORDER BY prod_description ASC" 
Products_cmd.Prepared = true

Set Products = Products_cmd.Execute
Products_numRows = 0
Dim arrProducts()
Dim counter

For counter = 0 to Products.RecordCount - 1
    ReDim Preserve arrProducts(counter,2)
    arrProducts(counter,0) = Products.Fields.Item("prod_id").Value
    arrProducts(counter,1) = Products.Fields.Item("prod_description").Value
    Products.MoveNext
Next
Response.Write(Str(UBound(arrProducts)))

Любые идеи будут высоко оценены ...

Ответы [ 4 ]

14 голосов
/ 30 декабря 2010

Вы почти у цели, проблема в том, что GetRows() возвращает двумерный массив, и вам нужно сообщить Ubound, какое измерение вы хотите.

Рабочий код:

Dim Products
Dim Products_cmd
Dim Products_numRows

Set Products_cmd = Server.CreateObject ("ADODB.Command")
Products_cmd.ActiveConnection = Conn
Products_cmd.CommandText = "SELECT prod_id, prod_description FROM dbo.products ORDER BY prod_description ASC" 
Products_cmd.Prepared = true

Set Products = Products_cmd.Execute

Dim arrProducts
arrProducts = Products.GetRows()

dim i
response.write "<table>"
For i = 0 to ubound(arrProducts, 2)
   response.write "<tr>"
   response.write("<td>" + trim(i+1))
   response.write("<td>" + trim(arrProducts(0,i)))
   response.write("<td>" + trim(arrProducts(1,i)))
next
response.write "</table>"
%>
1 голос
/ 11 января 2017

Я думаю, что самая большая путаница для программиста PHP, работающего в ASP, заключается в том, что размеры массива находятся в порядке, обратном тому, что вы ожидаете.

Исходя из PHP, я ожидаю, что theArray (0,2)быть первой записью, третий столбец.Нету.Это первый столбец третьей записи.И если вам нужно что-то похожее на ассоциативные массивы, вам нужно заняться созданием «словарей»

1 голос
/ 30 декабря 2010

Чтобы расширить объяснение amit_g:

<% OPTION EXPLICIT %>
<%

sub echo(x)
    response.write x
end sub

dim conn : set conn = server.createobject("ADODB.CONNECTION")
conn.open("Provider=SQLOLEDB;Data Source=.\SQLEXPRESS;Initial Catalog=tinker;uid=sa;pwd=devpassword")

dim sql : sql = "select '1a' as ColA , '1b' as ColB union all select '2a' , '2b' union all select '3a' , '3b' "

dim rs : set rs = conn.execute(SQL)

dim arr : arr = rs.GetRows()

dim cols : cols = ubound(arr,1)
dim rows : rows = ubound(arr,2)

dim x , y

echo "<table border='1' style='border-collapse:collapse;'>"
echo  "<tr>"
echo   "<td>&nbsp;</td>"
for x = 0 to cols
    echo   "<th>Col " & x & "</th>"
next
echo  "</tr>"
for y = 0 to rows
    echo  "<tr>"
    echo   "<th>Row " & y & "</th>"
    for x = 0 to cols
        echo   "<td>" & arr(x,y) & "</td>"
    next
    echo  "</tr>"
next
echo "</table>"

%>
1 голос
/ 30 декабря 2010

Первый блок кода выглядит правильно. Вы уверены, что читаете данные во втором измерении возвращаемого массива? Вот как GetRow заполняет массив.

arrProducts (0, 0) => prod_id - строка 1 arrProducts (1, 0) => prod_description - строка 1

arrProducts (0, 1) => prod_id - строка 2 arrProducts (1, 1) => prod_description - строка 2

и так далее. Также

Dim arrProducts ()

должно быть

Dim arrProducts

http://www.asp101.com/samples/viewasp.asp?file=db_getrows.asp

...