webForumDet fria alternativet

return rs från en inc-fil

ASP

10 svar · 496 visningar · startad av OveRRidE

Medlem sedan feb. 200112 078 inlägg
Frågan#1

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]

Medlem sedan jan. 20013 406 inlägg
#2

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

Medlem sedan feb. 200112 078 inlägg
#3

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]

Medlem sedan apr. 2001126 inlägg
#4

Vad händer om du byter ut:
set returnRS = rs

till:
returnRS = rs

------------------
Mvh/
Mattias Järnhäll
----------------------
www.kross.nu/aspsidan/

Medlem sedan dec. 200012 464 inlägg
#5

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

Medlem sedan feb. 200112 078 inlägg
#6

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]

Medlem sedan mars 20007 896 inlägg
#7

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

Medlem sedan feb. 200112 078 inlägg
#8

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.

Medlem sedan feb. 200112 078 inlägg
#9

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.

Medlem sedan dec. 200012 464 inlägg
#10

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]

Medlem sedan mars 20007 896 inlägg
#11

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]

274 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)