webForumDet fria alternativet

Texten försvinner

ASP

7 svar · 321 visningar · startad av Skarre

Medlem sedan apr. 20012 427 inlägg
Frågan#1

Ibland när jag hämtat ett värde ur en Accessdatabas och ska använda det flera gånger fungerar det bara den första gången. Exempelvis:

Response.Write rs("foo")
Response.Write rs("foo")

När detta uppstår, vilket bara sker när det gäller PM-fält (tror jag) skrivs värdet bara ut en gång. Varför? :)

Medlem sedan nov. 20017 144 inlägg
#2

Vet inte, men ett tips är att efter databasanropet/recordsetet lägga värdet i en variabel.

foo=rs("foo")
    Response.write foo
    Response.write foo
<%=foo%>
Medlem sedan nov. 20017 144 inlägg
#3

Vad jag förstått så är PM-fält lite korkade.
För övrigt så är det bra att lägga in samtliga fält i variabler för då kan du stänga recsetet direkt efter tilldelningen i stället för längst ned på sidan. :)

Medlem sedan juli 2001203 inlägg
#4

PM-fält är som sagt lite korkade... om jag inte missminner mig så kan man bara hämta värden från ett sådant en gång... så Jesper T:s förslag är korrekt

Medlem sedan dec. 20003 887 inlägg
#5

BLOBs verkar ha det här bekymret, men jag lyckades inte hitta någonstans ett varför. Däremot läste jag lite här och var det rekommenderas att man använder GetChunk() för att läsa BLOBs. Memo (PM) är en typ av BLOB även om det inte är riktigt samma sak.

Om man vill stänga anslutningen till databasen, men ändå ha kvar recordset:et går det fint att använda sig av disconnected recordsets genom att sätta ActiveConnection till Nothing.

Set [i]recordset[/i].ActiveConnection = Nothing

I övrigt håller jag med Jesper T om att det är smart att plocka ur fälten från recordset:et, som man behöver, till variabler.

Medlem sedan mars 20032 667 inlägg
#6

PM-fält är lite korkade att få till. En lösning är att lyda marsvinet:

http://www.webforum.nu/showthread.php?s=&postid=423621#post423621

Medlem sedan juni 20022 599 inlägg
#7

Varför?

Därför att ADO:n tolkar:

foo=rs("foo")

som:

foo=rs("foo").GetChunk(rs("foo").ActualSize)

om "foo" är ett PM/Blob.
Jämför:

foo1=rs("foo").GetChunk(100) ' Läs byte 1-100
foo2=rs("foo").GetChunk(100) ' Läs byte 101-200
foo3=rs("foo").GetChunk(100) ' Läs byte 201-300
' osv ..

Första gången anropar foo=rs("foo") så ber man alltså ADO:n hämta alla bytes mellan 1 och ActualSize, andra gången ber man den hämta allt mellan ActualSize och 2*ActualSize dvs ingenting.

Förvirrande: Ja. Buggigt/Korkat: Nej.

Medlem sedan apr. 20012 427 inlägg
#8

Tack för den utförliga förklaringen niko!

270 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)