2010-12-30 17 views
6

Próbuję naprawić aplikację ASP Classic i kiedy próbuję utworzyć tablicę z obiektu zestawu rekordów. Jednak nie mogę sprawić, by działał poprawnie.Klasyczny ASP 3.0 Utwórz macierz z zestawu rekordów

Ten kod daje mi jeden rekord (ostatni jeden), ale o ile widzę, to jest poprawne:

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

Za pomocą tego kodu daje mi „Indeks z zakresu:«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))) 

Wszelkie pomysły będą bardzo mile widziane ...

Odpowiedz

13

Twoje są prawie na miejscu, problem jest to, że GetRows() zwraca 2 wymiarową tablicę, a trzeba powiedz Ubound jakiego wymiaru chcesz.

kod robocza:

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>" 
%> 
+5

Po prostu pokazuje, że programista PHP nie powinien pisać kodu ASP ... hahaha. Dzięki Eduardo! –

+17

Nikt nie powinien pisać kodu ASP. : o – ctorx

0

pierwszy blok kodu wygląda poprawnie. Czy jesteś pewien, że czytasz dane w drugim wymiarze zwróconej tablicy? to, w jaki sposób GetRow zapełnia tablicę.

arrProducts (0, 0) => prod_id - wiersz 1 arrProducts (1, 0) => prod_description - wiersz 1

arrProducts (0, 1) => prod_id - wiersz 2 arrProducts (1 1) => prod_description - wiersz 2

i tak dalej. Również arrProducts

dim()

powinny być

Dim arrProducts

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

0

Aby rozwinąć na amit_g wyjaśnienia:

<% 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>" 

%> 
0

Myślę, że największym mylące rzeczą dla programisty PHP pracuje w ASP jest to, że wymiary tablicy są w odwrotnej kolejności czego oczekujesz.

Pochodząc z PHP, spodziewam się, że theArray (0,2) będzie pierwszym rekordem, trzecia kolumna. Nie. To pierwsza kolumna trzeciej płyty. A jeśli chcesz czegoś przypominającego tablice asocjacyjne, musisz zajrzeć do tworzenia "słowników".

Powiązane problemy