webForumDet fria alternativet
Logga in / Bli medlem

Vides paging med Get.Rows() ?

ASP

15 svar · 240 visningar · startad av iceM2

Medlem sedan mars 2001243 inlägg
Trådstart#1

Jag undrar om det går att modifiera Vides paging script för att använda Get.Rows? Så att man kan stänga connection objektet snabbare och slippa skapa ett Record Set??? Någon som har lust att hjälpa?

Vides paging script

<%
Set objRs = Server.Createobject("Adodb.Recordset")
strSQL = "Select * from tblTable Order by id asc"
strConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" &_
Server.MapPath("/") & "/../scripts/databas.mdb"

intPageId = request.querystring( "pageid" )
if intPageId = "" then intPageId = 1

with objRs
  .cursorlocation = 3
  .open strSQL, strConString
  .pagesize = 10
  .absolutepage = intPageId
end with

intPages = cint( objRs.pagecount )
intCurrentPost = 0

do while not objRs.eof and intCurrentPost < objRs.pagesize
  strContents = strContents &_
    "<tr><td>" & objRs( "fält1" ) & "</td>" &_
    "<td>" & objRs( "fält2" ) & "</td></tr>"
  intCurrentPost = intCurrentPost + 1
  objRs.movenext
loop

for i = 1 to objRs.pagecount
  strNavigation = strNavigation & " <a href='?pageid=" & i & "'>" & i & "</a>"
next

response.write "<table>" & strContents & "</table>"
response.write "<table><tr><td>" & strNavigation & "</td></tr></table>" 
%>

Hoppas att det var okej att jag publicerade din kod Vide!

Medlem sedan dec. 200012 464 inlägg
#2

Jo, det går väl, men då skriptet använder ett client-side recordset så tjänar du inte mycket på att skriva om det med getrows.

Är det någon som har en konkret jämförelse?

Medlem sedan mars 2001243 inlägg
#3

finns det inte något exempel där ett paging script använder getrows och är prestandamässigt bättre än en lösning med recset? Hur gör ni när ni använder paging?

Medlem sedan mars 2001243 inlägg
#4

Ingen som har en lösning på detta? Eller ska man helt enkelt inte använda getrows när man har paging??? Skulle verkligen uppskatta om nån hjälper mig med detta!

Medlem sedan dec. 19998 577 inlägg
#5

Så att man kan stänga connection objektet snabbare

Du kan stänga connection-objektet genom att lägga till .ActiveConnection = nothing, vilket resulterar i ett diconnected recordset:

with objRs
.cursorlocation = 3
.open strSQL, strConString
.pagesize = 10
.absolutepage = intPageId
.ActiveConnection = nothing
end with

och slippa skapa ett Record Set???

Du kommer aldrig att komma ifrån att ett recordset skapas, för det är just recordsettet som du använder metoden .GetRows() på.

Hoppas att det var okej att jag publicerade din kod Vide!

Självklart, scriptet är till för att användas... ;)

Medlem sedan dec. 19998 577 inlägg
#6

Om du kollar under script här på wF så hittar PatrikBs pagingscript som använder .GetRows():
http://cgi.webforum.nu/wf/Forum11/HTML/003221.html

Medlem sedan mars 2001243 inlägg
#7

är jag blind??? Jag kan inte se att han använder Get.Rows() på något ställe i scriptet...

Medlem sedan feb. 20012 412 inlägg
#8

Kod från PatriksB paging:

If Not m_objRS.EOF Then
m_arrRecords = m_objRS.GetRows()
getRecords = m_arrRecords
End If

I övrigt så är det inte att skapa recset i sig som snabbar upp. Det är 2 andra faktorer som snabbar upp:

  1. Som du själv säger, connectionobjectet stängs fort.

  2. Samtlig data hämtas med få hämtningar och läggs i en array. Sedan loopas det ut i en for-slinga. Till skillnad från när man hämtar en rad i taget i en Do- eller whileloop.

mvh Jörgen :)

Medlem sedan mars 2001243 inlägg
#9

http://cgi.webforum.nu/wf/Forum11/HTML/003221.html

Det var ju inte så konstigt att jag inte hittade Getrows! Vides länk leder ju till en annan version av scriptet som inte använder Getrows.

Länken till diskussionen om Patriks script med paging och getrows ska vara:
http://cgi.webforum.nu/wf/Forum11/HTML/004000.html

Länken för att ladda ner scriptet är:
http://script.webforum.nu/wf/Forum1/HTML/000063.html

Vide ville bara göra dig uppmärksam om att länken på webeye leder också till fel länk, bara så du vet ;-)

Tack för hjälpen folks!

Medlem sedan jan. 20013 341 inlägg
Medlem sedan mars 2001243 inlägg
#11

Tackar, kollade på det scriptet och det verkar ju vara riktigt bra, inte alls lika mycket kod som i Patriks script =)

Medlem sedan feb. 20012 412 inlägg
#12

Poängen med Patriks script är att det fungerar både i chilliASP och "vanlig ASP"

mvh Jörgen :)

Medlem sedan mars 20002 836 inlägg
#13

Precis som jörgen sa så är min paging anpassad för både chilliASP och "vanlig asp".
Om jag körde vanlig asp så skulle jag använda mig av denna lösning:

<%
Option Explicit
Response.Buffer = True

Dim intPage, intPageSize, N
Dim strSQL
Dim objConn, objRS
Dim varArray

'## -- kolla vilken sida besökaren/användaren vill se --
intPage = Request.QueryString("page")
	'## -- kontrollera att någonsida är namngiven.
	'##    om inte, visa första sidan --
	If Len(intPage) = 0 Then intPage = 1

'## -- hur många poster ska visas per sida --
intPageSize = 2

'## -- sql-fråga för att hämta de poster man vill visa --
strSQL = "SELECT * " & _
	"FROM FORUM_CATEGORY ORDER BY CAT_NAME"

'## -- skapa connection objectet --
Set objConn = Server.CreateObject("ADODB.Connection")

	'## -- öppna specifierad databas/databas-fil
	objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
		"Data Source=" & Server.MapPath("/db-folder/db-fil.mdb")
		
	'## -- skapa recordset objectet --
	Set objRS = Server.CreateObject("ADODB.Recordset")
		'## -- hur många poster per sida ska visas --
		objRS.PageSize = intPageSize
		
		'## -- öppna recordsetet --
		objRS.Open strSQL, objConn, 1, 3
		
		'## -- kolla att det har returnerats några poster --
		If Not objRS.EOF Then
			'## -- gå till första posten på sidan --
			objRS.AbsolutePage = intPage
			
			'## -- hämta alla poster och spar dem till en 2-dimensionell array --
			varArray = objRS.GetRows(intPageSize)
		End If
		
		'## -- clean up --
		objRS.Close
	Set objRS = Nothing
Set objConn = Nothing
%>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<%
If IsArray(varArray) Then
	For N = 0 To UBound(varArray,2)
		Response.Write varArray(2,N) & "<BR>"
	Next
End If

If CLng(intPage) > 1 Then
	Response.Write " <A href=""" & Request.ServerVariables("SCRIPT_NAME") & "?page=" & intPage - 1 & """>Föregående</A> "
End If	

If CLng(intPage) < CLng(UBound(varArray,2)+1) Then
	Response.Write " <A href=""" & Request.ServerVariables("SCRIPT_NAME") & "?page=" & intPage + 1 & """>Nästa</A> "
End If
%>
</BODY>
</HTML>

som hämtar endast de records som ska visas på respektive sida ... om man ändå håller på och ska köra med ADODB.Recordset så kan man låta dess inbyggda metoder/egenskaper få jobba lite *ler* när de ändå finns där såååå lätt åtkomliga som de är ;)

cya,
PatrikB

Medlem sedan mars 2001243 inlägg
#14

Tackar så mycket för detta script Patrik =) Jag kör med ditt verkar lättare nu än var det var innan =)

Hur skulle denna koden se ut om du la till sidnavigeringsmenyn? dvs så man kan hoppa mellan olika sidor förutom näst och föregående..

Tips: lägg upp även detta på script avdelningen!!

Medlem sedan mars 20002 836 inlägg
#15

kolla in mitt script som ligger under wF Script. Där finns det 3 st subbar: NextPage, PrevPage och PageNumbers ... om jag inte missminner mig totalt *ler*.
Dessa subbar kan du använda på de sidor som du vill ha pagebar på som ser ut typ: Föregående 1 2 3 4 Nästa

Det som behöver "passas" in i de olika subbarna är hur många sidor som själva recordsetet består av och vilken sida man är på.

cya,
PatrikB

Medlem sedan mars 2001243 inlägg
#16

okej, ska ta mig en titt på detta när jag fått resten av scriptet att fungera, tack för hjälpen ännu en gång i alla fall!

262 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
117 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)