Du har ju inte specificerat vilken tabell och vilka fält du ska hämta.
Eller du kanske inte har tagit med det här.
Har du kollat så att strdatabasepath är rätt?
------------------
Adde
10 svar · 496 visningar · startad av OveRRidE
Jag försöker returnera ett recordset, med denna enkla funktion:
function returnRS(SQL)
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
conn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(strDatabasePath) )
set rs = conn.execute(SQL)
set returnRS = rs
end function
som jag anropar med
set rs = returnRS(SQLstr)
men jag får
Item cannot be found in the collection corresponding to the requested name or ordinal.
på den första raden där jag skall hämta ur recordset:et på sidan:
response.write rs("usrUsername")
Vad är fel?
------------------
Jag gillar chokladblå himmel.
[Redigerat av OveRRidE den 11 feb 2002]
Du har ju inte specificerat vilken tabell och vilka fält du ska hämta.
Eller du kanske inte har tagit med det här.
Har du kollat så att strdatabasepath är rätt?
------------------
Adde
Du har ju inte specificerat vilken tabell och vilka fält du ska hämta.
Jo, men den är inte med: (Här är det :))
sqlStr = "SELECT * FROM users WHERE id = " & session("userid") & ""
Ligger ju givetvis innan anropet.
Har du kollat så att strdatabasepath är rätt?
Jupp. Och det körs ju en server.mappath på conn-raden med.
strDatabasePath = "/data/data.mdb"
------------------
Jag gillar chokladblå himmel.
[Redigerat av OveRRidE den 11 feb 2002]
Vad händer om du byter ut:
set returnRS = rs
till:
returnRS = rs
------------------
Mvh/
Mattias Järnhäll
----------------------
www.kross.nu/aspsidan/
DÅ du har conn som en lokal variabel i din sub så kommer det att objektet att försvinna när du lämnar suben.
Du kan ju fundera på vad som händer med ditt recordset då.
------------------
essentitia preter non sans multiplicandum
Vad händer om du byter ut...
Inget. :)
LarsG >> Men det är en funktion ju.. ingen sub.. :q Skall jag dim:a och instansiera conn och rs utanför funktionen då?
[redigerat mängder]
------------------
Jag gillar chokladblå himmel.
[Redigerat av OveRRidE den 11 feb 2002]
Tips: Använd dig av GetRows och returnera en tvådimensionell array. Då gör det inget om du har en lokal databaskoppling.
------------------
SPiN, bjorne.w@telia.com
SPiN > Jag antar att det är lättast att söka på det.. ;) Men det låter krångligt med en tvådimensionell array..
------------------
Jag gillar chokladblå himmel.
Men om jag använder en array kan jag väl inte loopa igenom "recordsetet" på samma sätt? Det är väl mest bra ifall man vill ha ut en rad och enbart en, typ..? Eller har jag missuppfattat det helt? :q Har faktiskt aldrig använt getRows.. :l
------------------
Jag gillar chokladblå himmel.
Yada, yada. Om det är en sub eller function har ingen betydelse för vilket scope som objekt har.
Jo, jag skulle nog göra skapa connection-objektet utanför sub
dim conn
set conn = server.createobject("adodb.connection")
och sedan skicka det som parameter till din funktion där du kan kolla om det behöver öppnas eller inte
function (conn,sqlstr)
if conn.state = 0 then 'adStateClosed
conn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(strDatabasePath) )
end if
set returnRS = conn.execute(sqlstr)
end function
red: Det som händer i din kod är att recordsetet stängs när ditt conn-objekt försvinner.
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 11 feb 2002]
Japp, du har missuppfattat. :e
Det är superenkelt! Eftersom att jag är så dålig på att förklara, visar jag med lite kod istället...
Function getRows ( sSQL )
Dim conn
set conn = Server.CreateObject ( "ADODB.Connection" )
conn.Open ( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath ( strDatabasePath ) )
set rs = conn.execute ( sSQL )
If rs.EOF Then
rs.Close
conn.Close
set rs = Nothing
set conn = Nothing
getRows = Null
Else
Dim arrRows
arrRows = rs.GetRows ()
rs.Close
conn.Close
set rs = Nothing
set conn = Nothing
getRows = arrRows
End If
End Function
Dim arrRows
arrRows = getRows ( "SELECT fldName, fldEmail FROM users WHERE id = " & Session ( "userid" ) )
If IsArray ( arrRows ) Then
Dim i
For i = lBound ( arrRows, 2 ) To uBound ( arrRows, 2 )
Response.Write "Namn: " & arrRows ( 0, i ) ' 0:an anger vilket fält som ska hämtas, i från vilken rad
Response.Write "<br/>"
Response.Write "E-mail: " & arrRows ( 1, i )
Next
Else
Response.Write "Inga poster"
End If
Det är lite som skiljer, dvs. bör du ange vilka fält som ska hämtas med SQL-frågan, så att du vet i vilken ordning du får dem. Arrayen använder du sedan som en vanlig tvådimensionell array, med fältet i första dimensionen och värdet på fältet i andra dimensionen.
Hoppas det blev lite klarare, annars får någon mer pedagogisk försöka... ;)
Red.} Hade glömt lite felhantering...
------------------
SPiN, bjorne.w@telia.com
[Redigerat av SPiN den 11 feb 2002]