Avatar billede dittlau Nybegynder
24. juli 2003 - 21:13 Der er 15 kommentarer og
2 løsninger

Paging i ASP - MySQL db

Hejsa

Jeg har et lille problem med at få paging til at virke i min kode. Jeg har brug for noget input.
Her er koden der skal flyttes paging ind i:
--------
<%  ' Her henter vi alle indlæg
                               
strQuery = "SELECT * FROM forum order by AutoNr DESC LIMIT 1000;"
Set RS = adoDataConn.Execute(strQuery)

While not RS.eof
response.write("<TR><TD><font size='1'><A HREF='indlaeg_vis.asp?Id=" & RS("AutoNr") & "'>" & RS("Emne") & "</A></font></TD><TD><font size='1'>" & RS("Navn") & "</TD><TD><font size='1'>" &  RS("OpretDato") & "</TD></TR>")
Rs.MoveNext
Wend
       
RS.CLose
adoDataConn.Close
%>
--------

Håber der er nogen der kan hjælpe!

/dittlau
Avatar billede longshanks Nybegynder
24. juli 2003 - 21:39 #1
Her er en paeing funktion til en GB der virker:


<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../CSS/Standard.css" rel="stylesheet" type="text/css">
<%
dim sideNummer
sideNummer = request.QueryString("sidenummer")
if sideNummer = "" then
sideNummer = 1
end if

Set Conn = Server.CreateObject("ADODB.Connection")
'sConnection = "Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\db\frederikshavn.mdb;"
sConnection = "Driver={Microsoft Access Driver (*.mdb)};DBQ=d:\home\longshanksdk\db\frederikshavn.mdb;"
Conn.Open(sConnection)
strSQL = "Select * from personer order by ID DESC"
Set rs = server.CreateObject("adodb.recordset")
rs.pageSize = 10
rs.open strSQL, Conn, 1
rs.absolutePage = sideNummer

%>
</head>
<body onLoad="MM_preloadImages('../Billeder/include/skrivBeskedNed.gif')">
<div align="center">
  <!--#include file="header.asp" -->
  <a href="skrivbog.asp" onMouseOver="MM_swapImage('Image1','','../Billeder/include/skrivBeskedNed.gif',1)" onMouseOut="MM_swapImgRestore()"><img src="../Billeder/include/skrivBeskedOp.gif" name="Image1" width="134" height="59" border="0" id="Image1"></a>
  <%
response.write "<center>"
for t = 1 to rs.PageCount
    if t = cint(sideNummer) then
        Response.Write "&nbsp;&nbsp;"
    else
        Response.write "<a href='laesbog.asp?sidenummer="&t&"'>"&t&"</a> &nbsp;"
    end if
Next
response.write "</center>"

Response.write "<br><br>"

dim count
count = 0


while not rs.eof and count<10
Response.write "<table bgColor='#517654' width='450' align='center' class='tableborder'>"
count = count+1
Response.Write "<tr><td align='center'><font size='2'><b><u>Skrevet d. " & rs("Dato") & " af " & rs("Fornavn") & " " & rs("Efternavn") & "<u><b></font></td></tr>"
Response.write "<tr><td><font size='2'>" & rs("Besked") & "</font></td></tr>"
rs.moveNext
Response.Write "</table>"
Response.write "<br>"
wend


rs.close
Conn.close
Set rs = nothing
Set Conn = nothing
%>
  <!--#include file="footer.asp" -->
</div>
</body>
</html>
Avatar billede hossein Nybegynder
24. juli 2003 - 21:57 #2
jeg tror dit problem er at du vælger "LIMIT 1000" fjern den og køre en gang:
strQuery = "SELECT * FROM forum order by AutoNr DESC;"
Set RS = adoDataConn.Execute(strQuery)
Avatar billede dittlau Nybegynder
24. juli 2003 - 22:28 #3
->>longhanks
Så får jeg denne fejl:
ADODB.Recordset error '800a0e79'
Operation is not allowed when the object is open.

/indlaeg_alle1.asp, line 220
-------
koden:
-------
<%  ' Her henter vi alle indlæg
'paging
dim sideNummer
sideNummer = request.QueryString("sidenummer")
if sideNummer = "" then
sideNummer = 1
end if
'Set Conn = Server.CreateObject("ADODB.Connection")
'sConnection = "Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\db\frederikshavn.mdb;"
'sConnection = "Driver={Microsoft Access Driver(*.mdb)};DBQ=d:\home\longshanksdk\db\frederikshavn.mdb;"
'Conn.Open(sConnection)
'strSQL = "Select * from personer order by ID DESC"
strQuery = "SELECT * FROM forum order by AutoNr DESC LIMIT 1000;"
Set RS = adoDataConn.Execute(strQuery)
'Set rs = server.CreateObject("adodb.recordset")
rs.pageSize = 10
rs.open strSQL, Conn, 1 <<<-----Line 220----->>>
rs.absolutePage = sideNummer
   
'response.write "<center>"
for t = 1 to rs.PageCount
if t = cint(sideNummer) then
Response.Write "&nbsp;&nbsp;"
else
Response.write "<a href='indlaeg_vis1.asp?sidenummer="&t&"'>"&t&"</a> &nbsp;"
end if
Next
'response.write "</center>"
'Response.write "<br><br>"

dim count
count = 0

while not rs.eof and count<10
'Response.write "<table bgColor='#517654' width='450' align='center' class='tableborder'>"
count = count+1
'Response.Write "<tr><td align='center'><font size='2'><b><u>Skrevet d. " & rs("Dato") & " af " & rs("Fornavn") & " " & rs("Efternavn") & "<u><b></font></td></tr>"
'Response.write "<tr><td><font size='2'>" & rs("Besked") & "</font></td></tr>"
'While not RS.eof
response.write("<TR><TD><font size='1'><A HREF='indlaeg_vis.asp?Id=" & RS("AutoNr") & "'>" & RS("Emne") & "</A></font></TD><TD><font size='1'>" & RS("Navn") & "</TD><TD><font size='1'>" &  RS("OpretDato") & "</TD></TR>")

rs.moveNext
'Response.Write "</table>"
'Response.write "<br>"
wend

'paging slut
RS.CLose
adoDataConn.Close
%>
Avatar billede dittlau Nybegynder
24. juli 2003 - 22:36 #4
Skal måske lige nævne, at jeg har en database.inc, der ser sådan ud:
<%
strConnection = "driver={MySQL};server=minserver;uid=bruger;pwd=pword;database=min db"
Set adoDataConn = Server.CreateObject("ADODB.Connection")
adoDataConn.Open strConnection
%>
Avatar billede dittlau Nybegynder
25. juli 2003 - 11:12 #5
Jeg sætter lige lidt ekstra point af.

/dittlau
Avatar billede hossein Nybegynder
25. juli 2003 - 21:40 #6
Den måde som longshanks viser, er til en *.mdb (msAccess), MySQL driveren understøtter ikke "client side cursors". (Hurrah Micro$oft!)
Men du kan kode dig ud af det.
Avatar billede dittlau Nybegynder
27. juli 2003 - 15:39 #7
-->>hossein

Er det noget du kan hjælpe med?

/dittlau
Avatar billede cjep Nybegynder
27. juli 2003 - 15:44 #8
"Client side cursors" kan bestemt også drille i ASP, meget ofte får man fejlen "ADODB.Recordset error '800a0cb3'. Current Recordset does not support bookmarks".

En workaround kan være at læse hele eller dele af database udtrækket ind i et array og udføre paging på arrayet i stedet. Jeg fandt engang et eksempel på ActiveDeveloper, men har desværre glemt ophavsmanden. Prøv at se, om du kan flette det ind med dit SQL kald.

/Cjep


<%
Const cTopicPrPage = 15 'Antal Threats/Topics/Emner pr. side, når man lister i forum.
Const cMaxIndex = 9 'Antal Sider i index.
Dim ii, LavLimit, HojLimit, LavPunktum, HojPunktum

'Index over Paging START
If intPageCount > cMaxIndex Then
If intPage >= (cMaxIndex\2) Then
HojLimit = intPage + (cMaxIndex\2)
LavLimit = intPage - (cMaxIndex\2)
End If
If intPage < (cMaxIndex\2) Then
HojLimit = intPage + (cMaxIndex\2)
LavLimit = intPage - (cMaxIndex\2)
End If
If LavLimit < 1 Then
LavLimit = 1
HojLimit = cMaxIndex + 1
HojPunktum = "...&nbsp;"
End If
If HojLimit > intPageCount Then
HojLimit = intPageCount
LavLimit = HojLimit - cMaxIndex
LavPunktum = "...&nbsp;"
End If
Else
LavLimit = 1
HojLimit = intPageCount
End If
Response.Write "<table>"
Response.Write "<tr><td>&nbsp;Sider:&nbsp;(" & intPageCount & ")&nbsp;"
Response.Write "<a href=""?side=1"">&lt;</a>&nbsp;"
Response.Write LavPunktum
For ii = (LavLimit) to HojLimit
If cInt(intPage) = cInt(ii) Then
Response.Write "<b>[" & ii & "]</b>&nbsp;"
Else
Response.Write "<a href=?side=" & ii & ">" & ii & "</a>&nbsp;"
End If
Next
Response.Write HojPunktum
Response.Write "<a href=""?side=" & intPageCount & """>&gt;</a>"
Response.Write "</td></tr></table>"
'Index over Paging SLUT
%>
Avatar billede keysersoze Ekspert
27. juli 2003 - 20:05 #9
hvis man skal lave paging vha en mysql database må man slet slet ikke bare tænke i access-retning - løsningen til access kan slet ikke bruges og desuden findes en meget lettere løsning i mysql.

I mysql kan løsning laves vha LIMIT - fx;

SELECT * FROM tabel LIMIT 0, 11
'loop igennem 10 gange
'lav frem og tilbage knapper

når man så skal til side 2 vil sql'en bare se sådan ud;
SELECT * FROM tabel LIMIT 10, 11
'loop igennem 10 gange
'lav frem og tilbage knapper

grunden til at jeg udvælger 11 i stedet for de 10 der måske skal vises er, at jeg ellers risikerer på sidste side at få en fejl...
Avatar billede dittlau Nybegynder
28. juli 2003 - 00:00 #10
Tak for de mange forslag, i er ikke glemt, har bare ikke lige haft tid til at prøve jeres eksempler endnu. Bliver afprøvet i løbet af et par dage.

/dittlau
Avatar billede dittlau Nybegynder
01. august 2003 - 00:19 #11
Jeg har desværre endnu ikke haft tid til at teste jeres forslag, da jeg har været meget ophængt på arbejdet.

Jeg er først tilbage fra ferie d. 18. august, så før bliver det ikke testet.

/dittlau
Avatar billede dittlau Nybegynder
06. september 2003 - 00:01 #12
Kan ikke lige få noget af det til at virke.
Keysersoze->> Kan du komme med lidt kode, er bestemt ikke 100-meter mester i det her.

/dittlau
Avatar billede keysersoze Ekspert
06. september 2003 - 00:21 #13
hvis du kommer prøver at poste koden så langt som du er nået så er det lidt lettere at arbejde ud fra det

men som udganspunkt - hvis du lavet sql'en som jeg skriver og looper record-settet igennem som normalt er du et godt stykke af vejen
Avatar billede hossein Nybegynder
06. september 2003 - 11:10 #14
Tilpas til din egen side, du skal bare sætte knapperne frem og tilbage:

<%
  Response.Buffer = True
  Const RecsPage = 40  'Antal record pr side
  Dim CurPage          'Current Page
  Dim TotalPages      'Total Antal side
  Dim count
  Dim lrecs
  Dim CurrOffset
  Dim minFelt
  Dim RecLow
  Dim RecHigh
  Dim iTempPageCount,iTempRecCount

        minFelt1 = Request.Form("minFelt")
        CurPage = Request.QueryString("CurPage") 
       
'***********Find den korrekte SQL til at bruge

        SQL = "Select * FROM minTabel WHERE minFelt LIKE '"  & ("%") & minFelt1 & ("%") & "'"

'***********Tilfoej og brgraens cause og offset
        SQLrecs = "SELECT count(*) FROM minTabel" 'det er det samme tabel
        SET aRS = Conn.Execute (SQLrecs)
        lrecs = aRS("Count(*)")
        aRS.Close
       
        iTempPageCount = lrecs MOD RecsPage
        iTempRecCount = RecsPage / 2
       
        IF iTempCount = iTempRecCount THEN
                TotalPages = Round(lrecs/RecsPage)
        ELSEIF iTempCount < iTempRecCount THEN
                TotalPages = Round(lrecs/RecsPage) + 1
        ELSE
                TotalPages = Round(lrecs/RecsPage)
        END IF
        IF isNumeric(CurPage) THEN
                CurPage = CLng(CurPage)
                CurrOffset = CINT(CurPage*RecsPage) - RecsPage               
        END IF
        IF CurPage = "" OR CurPage = "0" THEN
                CurPage = 1
                CurrOffset = 0
        END IF

        RecLow = CurrOffset
        IF CurPage = TotalPages THEN
                RecHigh = lrecs
        ELSE
                RecHigh = CurrOffset + RecsPage
        END IF
        IF RecLow = 0 THEN RecLow = 1
        SQL = SQL & " LIMIT " & CurrOffset & ", " & RecsPage & ""
                       
'*****Lav recordset og koer                 
        set RS = Conn.Execute(SQL)
Avatar billede dittlau Nybegynder
08. september 2003 - 23:36 #15
->>hossein
Den kan jeg ikke greje, men jeg har fundet et eksempel på activedeveloper.dk, som er rettet til. Det minder en del om dit eksempel, og om det Keysersoze prøvede at spore mig ind på tror jeg.
Her er problemet bare, at koden kun henter 24 poster ud af min DB, og der ligger ca. 150, så hvis der er nogen der kan se fejlen.

---
<%  ' Her henter vi alle indlæg
'paging
       
'Dim Conn
'Conn =
                       
'Først skal vi have antallet af poster
Set objRs = adoDataConn.Execute("SELECT AutoNr AS records FROM forum;")
intRecords = int(objRs("records"))
objRs.Close
Set objRs = Nothing

'Variabler til query´et
intPage = Request.QueryString("page")
if intPage = "" OR not isNumeric(intPage) then
  intPage = int(1)
else
  intPage = int(intPage)
end if
intPageSize = int(10)
intStart = intPage*intPageSize
intStart = intStart-intPageSize
intPages = int(intRecords/intPageSize)+1

'ekstra indsat
intValue = (intRecords - intStart)
If intPageSize > intValue Then
  intPageSize = intValue
end if
'ekstra indsat slut

Set objRs = adoDataConn.Execute("SELECT * FROM forum Order By AutoNr DESC _ LIMIT " & intStart & ", " & intPageSize & ";")
   
if objRs.EOF or objRs.BOF then
  Response.Write "Ingen poster"
else
  'Response.Write "<table border=""1"" cellpadding=""3"">"
  'Response.Write "<tr>"
  'Response.Write "<td><b>id</b></td>"
  'Response.Write "<td><b>Site</b></td>"
  'Response.Write "</tr>"
               
Do until objRs.EOF
  'Response.Write "<tr>"
  'Response.Write "<td>" & objRs("id") & "</td>"
  response.write("<TR><TD><font size='1'><A HREF='indlaeg_vis.asp?Id=" & objRs("AutoNr") & "'>" & objRs("Emne") & "</A></font></TD><TD><font size='1'>" & objRs("Navn") & "</TD><TD><font size='1'>" &  objRs("OpretDato") & "</TD></TR>")
  'Response.Write "<td><a href="indlaeg_vis.asp"" & objRs("AutoNr") & """>" &  objRs("Emne") & "</a></td>"
  'Response.Write "</tr>"
objRs.MoveNext
  Loop
  'Response.Write "</table>"
end if

objRs.Close
Set objRs = Nothing
           
%>

</TABLE>
<%
Response.Write "<HR>"
Response.Write("<TABLE align='right'>")
Response.Write("<tr>")
Response.Write("<td>")
'Udskriver en "sideliste"
For i = 1 to intPages
if i = intPage then
  Response.Write "<b>" & i & "</b> "
  'Response.Write("</td>")
  'Response.Write("</tr>")
  'Response.Write("</table>")
else
  Response.Write "<a href=""indlaeg_alle1.asp?page=" & i & """>"
  'Response.Write "<a href=""paging.asp?page=" & i & """>"
  Response.Write i
  Response.Write "</a> "
  'Response.Write("</td>")
  'Response.Write("</tr>")
  'Response.Write("</table>")
End if
next
Response.Write("</td>")
Response.Write("</tr>")
Response.Write("</table>")
   
adoDataConn.Close
Set adoDataConn = Nothing
           
'paging slut
%>
----
Avatar billede dittlau Nybegynder
10. september 2003 - 22:52 #16
Fandt selv en løsning.

Tak for hjælpen til alle.

Har fordelt point mellem keysersoze og hossein. Hossein fik lidt flere, da jeg vist skylder ham lidt for noget hjælp tidligere. Håber det er ok.

/dittlau
Avatar billede psycho42 Nybegynder
17. marts 2007 - 11:56 #17
Glimrende for dig.. - Når man nu finder en løsning på et problem, som man selv stod og havde og oprettede et indlæg, kunne det så ikke være sejt at poste løsningen ? :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester