Vbscript 经典ASP 3.0从记录集创建阵列

Vbscript 经典ASP 3.0从记录集创建阵列,vbscript,asp-classic,ado,Vbscript,Asp Classic,Ado,我正在尝试修复一个ASP经典应用程序,当我尝试从记录集对象创建数组时。但是我不能让它正常工作 此代码为我提供了一条记录(最后一条),但据我所知,它是正确的: Dim Products Dim Products_cmd Dim Products_numRows Set Products_cmd = Server.CreateObject ("ADODB.Command") Products_cmd.ActiveConnection = Conn Products_cmd.CommandText

我正在尝试修复一个ASP经典应用程序,当我尝试从记录集对象创建数组时。但是我不能让它正常工作

此代码为我提供了一条记录(最后一条),但据我所知,它是正确的:

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)))

如果您有任何想法,我们将不胜感激……

第一个代码块看起来是正确的。您确定正在读取返回数组的第二维数据吗?这就是GetRow填充数组的方式

ARR产品(0,0)=>产品id-第1行 ARR产品(1,0)=>产品描述-第1行

ARR产品(0,1)=>产品id-第2行 ARR产品(1,1)=>产品描述-第2行

等等,还有

产品名称()

应该是

暗色产品


您就快到了,问题是
GetRows()
返回一个二维数组,您需要告诉您想要哪个维度

工作代码:

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>"
%>
Dim产品
Dim Products\U cmd
暗色产品
Set Products\u cmd=Server.CreateObject(“ADODB.Command”)
Products\u cmd.ActiveConnection=Conn
Products_cmd.CommandText=“从dbo.Products ORDER BY prod_description ASC中选择产品id、产品描述”
Products\u cmd.Prepared=true
Set Products=Products\u cmd.Execute
暗色产品
arrProducts=Products.GetRows()
昏暗的我
响应。写入“”
对于i=0到ubound(2)
响应。写入“”
回答。写(““+trim(i+1))
响应。写入(“+trim(0,i)))
回答。写(“+trim(1,i)))
下一个
响应。写入“”
%>

要扩展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>"

%>

我认为对于在ASP中工作的PHP程序员来说,最大的困惑是数组维度的顺序与您期望的相反


来自PHP,我希望数组(0,2)是第一条记录,第三列。不,这是第三条记录的第一列。如果你想要类似于关联数组的东西,你需要研究创建“字典”

只是告诉你一个PHP程序员不应该写ASP代码……哈哈哈。谢谢Eduardo!