ASP script geeft overflow error

Pagina: 1
Acties:

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Ik ben met een script bezig om automatisch pagina's te generen, wanneer er een bepaalde hoeveelheid rijen uit de database komen.
Er wordt hier gebruik gemaakt van een IIS server met een Acces database.
Bij het opvragen van de pagina krijg ik de volgende foutmelding:::

Microsoft VBScript runtime error '800a0006'

Overflow

/standaard/frm-030.asp, line 267


Ik heb al gezocht op dit forum en via google, maar ben er niet echt veel wijzer van geworden.
Hieronder het stuk script waar het waarschijnlijk om zou kunnen gaan.

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
    sqlLijst = "SELECT * FROM situatie LEFT JOIN medewerker ON situatie.naamindiener = medewerker.afkorting WHERE afgehandeld = 'true' ORDER BY categorie, serienr" 
    
' Opvragen startpositie 
Dim iStart, iOffset
iStart = Request("Start")
iOffset = Request("Offset") 
    
    'Voer SQL-opdracht uit
    set objRec = objCon.execute(sqlLijst)
    

    If NOT objRec.EOF Then
        If objRec.Fields("tussenvoegsels").Value <> "" Then
            varGebruikerNaam = objRec.Fields("roepnaam").Value & " " & objRec.Fields("tussenvoegsels").Value  & " " & objRec.Fields("naam").Value 
        Else
            varGebruikerNaam = objRec.Fields("roepnaam").Value & " " & objRec.Fields("naam").Value  
        End If
    End If
%>


 <% 
                    
If objRec.EOF Then
    Response.Write "<TR><TD colspan=""5""><SPAN class=""middelgroot"">Geen items gevonden</SPAN></TD></TR>"
Else
    Do While Not objRec.EOF 
    
        ' Zorg voor de verschillende pagina's
        varAlleData=objRec.getrows
        Dim iAantalRijen, iRijTeller, iStop

        iAantalRijen=ubound(varAlleData,2)
        
        If iAantalRijen > (iOffset + iStart) Then
            iStop = iOffset + iStart - 1
        Else
            iStop = iAantalRijen
        End If
        
        ' Loop door de rijen heen.
        FOR iRijTeller = iStart to iStop
        
    %>


  <% 
    objRec.MoveNext
    NEXT
    Loop

End If  

objRec.Close
Set objRec = Nothing
%>
<%= iAantalRijen %>

<br><table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr> 
            <td width="20%" align="left">
            <%
'Toon de vorige link
if iStart > 0 then
    Response.Write "<div align=""left""><a href=""FRM-030.asp?start=" & iStart-iOffset & "&offset=" & iOffset & """>Vorige " & iOffset & "</a></div>"
end if
%></td>
  <!-- !!! Dit is line 267 !!!-->          <td align="center"> Pagina <%= cInt(iStart/iOffset)+1 %> van de <%= round(((iAantalRijen+1)/iOffset)+0.49999) %></td>     
            <td width="20%" align="right"><%
'Toon de volgende link
if iStop < iRijTeller AND (iStart+iOffset) < iAantalRijen then
     Response.Write "<div align=""right""><a href=""FRM-030.asp?start=" & iStart+iOffset & "&offset=" & iOffset & """>Volgende " & iOffset & "</a></div>"
end if
 %>
              </td>
          </tr>
        </table>


Verder staat er nog wat "overbodige" html code ertussen.


Volgens de error zou het dus gaan om de volgende line :::
code:
1
2
      <td align="center"> Pagina <%= cInt(iStart/iOffset)+1 %> van de <%= 
round(((iAantalRijen+1)/iOffset)+0.49999) %></td>


Ik hoop dat jullie een oplossing hebben.

Proud member of the Cosmic Cows


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 15:44

Cyphax

Moderator LNX
Dat getal dat je probeert te casten naar int, is dat misschien groter dan 32768? Da's de limiet van integers. Als dat het geval is (response.write 'm eens zonder cast) moet je 'm casten naar een double of long ofzo (cDbl of cLng).

Saved by the buoyancy of citrus


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Is de waarde van iOffset niet 0? En een deling door 0 is doorgaans wat lastig uit te voeren natuurlijk.
Cyphax schreef op woensdag 17 augustus 2005 @ 11:24:
Dat getal dat je probeert te casten naar int, is dat misschien groter dan 32768? Da's de limiet van integers. Als dat het geval is (response.write 'm eens zonder cast) moet je 'm casten naar een double of long ofzo (cDbl of cLng).
Euh 32768 ?? Dat is de limiet van een short, of vinden ze met ASP/VBScript dat integers maar 16 bits hoeven te zijn, ipv de standaard 32 bits :?

[ Voor 71% gewijzigd door ACM op 17-08-2005 11:27 ]


Verwijderd

Debug je pagina eens. Wat zijn de waarden in de formule die in die regel staan ?

Verwijderd

ACM schreef op woensdag 17 augustus 2005 @ 11:26:
Is de waarde van iOffset niet 0? En een deling door 0 is doorgaans wat lastig uit te voeren natuurlijk.
[...]

Euh 32768 ?? Dat is de limiet van een short, of vinden ze met ASP/VBScript dat integers maar 16 bits hoeven te zijn, ipv de standaard 32 bits :?
in Vb zijn Integers Signed 16 bit. Long-variabelen zijn signed 32-bit !

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Bij het invoeren van

aantal rijen<%= iAantalRijen %><br>
iStop <%= iStop %><br>
iOffset<%= iOffset %><br>
iStart<%= iStart %><br>

krijg ik de volgende output

aantal rijen39
iStop -1
iOffset
iStart


Offset en Start hebben dus geen waarde, waardoor het inderdaad logisch is dat hij niet kan delen.
Wanneer ik (iStart/iOffset)+1 een response.write geef krijg ik de volgende foutmelding
Response object error 'ASP 0106 : 80020005'
Type Mismatch


Maargoed, ze hebben dus geen waarde meegekregen. Nu dat weer onderzoeken waarom dat zo het geval is....

edit::: ik heb het ook met cLng en cDbl geprobeerd, maar dat mocht dus ook niet baten

[ Voor 15% gewijzigd door Theske op 17-08-2005 11:44 ]

Proud member of the Cosmic Cows


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 15:44

Cyphax

Moderator LNX
ACM schreef op woensdag 17 augustus 2005 @ 11:26:
Is de waarde van iOffset niet 0? En een deling door 0 is doorgaans wat lastig uit te voeren natuurlijk.
[...]

Euh 32768 ?? Dat is de limiet van een short, of vinden ze met ASP/VBScript dat integers maar 16 bits hoeven te zijn, ipv de standaard 32 bits :?
Ja zoiets. Ik liep hier vorige week ook tegenaan.
http://msdn.microsoft.com...pt56/html/vbsdatatype.asp

Saved by the buoyancy of citrus


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Okej, het overload probleem is volgens mij verholpen. ik heb het volgende toegevoegd, was misschien wel handig ;)

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
'controle op posities  
if Not IsNumeric(iStart) or Len(iStart) = 0 then
    iStart = 0
else
    iStart = CInt(iStart)
end if

if Not IsNumeric(iOffset) or Len(iOffset) = 0 then
    iOffset = 10
else
    iOffset = Cint(iOffset)
end if

De output van de waardes zijn als volgt...

aantal rijen39
iStop 9
iOffset10
iStart0

Dus dit ziet er ook goed uit. Echter krijg ik nu nog steeds een foutmelding::::

ADODB.Field error '800a0bcd'

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

/standaard/frm-030.asp, line 231


line 231 is...
code:
1
If objRec.Fields("tussenvoegsels").Value <> "" Then

En hieronder het vervolg::
code:
1
2
3
4
varNaam = objRec.Fields("roepnaam").Value & " " & objRec.Fields("tussenvoegsels").Value  & " " & objRec.Fields("naam").Value 
        Else
            varNaam = objRec.Fields("roepnaam").Value & " " & objRec.Fields("naam").Value   
        End If

Proud member of the Cosmic Cows


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 16:43

Creepy

Tactical Espionage Splatterer

Hmmja.. ook hiet moet je met een beetje debuggen zelf wel uit kunnen komen toch?
De foutmelding is vrij duidelijk: Je kan geen record uit je record set benaderen. Staat deze nog open? Geeft je query wel resultaat terug? Ben je hier niet al een keer doorheen gelopen? etc.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Foutmelding lijkt me duidelijk. Wellicht is de recordset leeg op dat punt ...

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 12:42

Robtimus

me Robtimus no like you

Gokje: het komt door de MoveNext in een ongecontroleerde loop.

Je hebt wel heel mooi een controle op EOF in je main loop (do while), maar het MoveNext zelf doe je in de For loop. Tijdens dat loopen moet je dus OOK controleren op EOF.

Edit: dit veroorzaakt niet de fout die je nu krijgt, maar zal vrijwel zeker later alsnog voor problemen zorgen.

[ Voor 20% gewijzigd door Robtimus op 17-08-2005 12:59 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Ik heb nu weer verschillende dingen geprobeerd.
Ik heb de record nog maar eens afgesloten en leeg gegooid dmv

objRec.Close
Set objRec = Nothing


Nadat ik dit heb gedaan geeft hij aan ' Object required ' . Dit schiet dus ook niet echt op.
De query geeft wel resultaat, gezien hij het aantal rijen weergeeft die eruit komen.. dus het lijkt me dat hij wel iets geeft.
Tja, ik programmeer meestal in php, maar nu heb ik een opdracht in asp wat mij wel redelijk afgaat, alleen hier blijf ik bij steken.....
Iemand misschien en idee wat en waar in iets moet toevoegen en/of verwijderen... ik ben zelf al wezen zoeken op internet maar kom er spijtig genoeg nog steeds niet helemaal uit.

Proud member of the Cosmic Cows


Verwijderd

Theske schreef op woensdag 17 augustus 2005 @ 11:59:
Okej, het overload probleem is volgens mij verholpen. ik heb het volgende toegevoegd, was misschien wel handig ;)

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
'controle op posities  
if Not IsNumeric(iStart) or Len(iStart) = 0 then
    iStart = 0
else
    iStart = CInt(iStart)
end if

if Not IsNumeric(iOffset) or Len(iOffset) = 0 then
    iOffset = 10
else
    iOffset = Cint(iOffset)
end if
Dit kun je vereenvoudigen naar
code:
1
2
iStart = "0" & IStart
IOffset = "0" & iOffset


Een lege string wordt automatisch 0, en wanneer er al een getal in staat dat komt er alleen maar een 0 voor te staan.

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Verwijderd schreef op woensdag 17 augustus 2005 @ 13:57:
[...]


Dit kun je vereenvoudigen naar
code:
1
2
iStart = "0" & IStart
IOffset = "0" & iOffset


Een lege string wordt automatisch 0, en wanneer er al een getal in staat dat komt er alleen maar een 0 voor te staan.
Nee, dat gaat niet helemaal goed dan. Die "10" was ook juist de bedoeling om de eerste 10 rijen weer te geven, vandaar. En nu zet hij hem gewoon op 0 en dat hoord niet.

Maar verder nog iemand die mij verder kan helpen?? :|

Proud member of the Cosmic Cows


Verwijderd

Theske schreef op woensdag 17 augustus 2005 @ 14:17:
[...]


Nee, dat gaat niet helemaal goed dan. Die "10" was ook juist de bedoeling om de eerste 10 rijen weer te geven, vandaar. En nu zet hij hem gewoon op 0 en dat hoord niet.

Maar verder nog iemand die mij verder kan helpen?? :|
oeps, sorry, had die 10 niet zien staan.
Maar je hoeft toch dan alleen maar een "If iOffset = 0 then iOffset = 10" toe te voegen......duh

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Ja, daar had ik het zelf inderdaad ook maar even in veranderd. Bedankt iig
Mja, helaas is daar het probleem nog niet mee opgelost :'(

Proud member of the Cosmic Cows


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat je ' Object required ' krijgt is heel logisch als je net daarboven
objRec.Close
Set objRec = Nothing
hebt gedaan. objRec is dan namenlijk niks meer.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
rwb schreef op woensdag 17 augustus 2005 @ 14:39:
Dat je ' Object required ' krijgt is heel logisch als je net daarboven
objRec.Close
Set objRec = Nothing
hebt gedaan. objRec is dan namenlijk niks meer.
Ja dat snap ik... en als ik het zonder ermee doe, dan geeft hij alsnog een foutmelding zoals ik eerder had vermeld. (zie hieronder) Dus echt veel schiet ik er nog niet mee op... :/

ADODB.Field error '800a0bcd'

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

Proud member of the Cosmic Cows


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja dat is ook logisch

je vraagt ergens een veld op waar BOF of EOF geld voor je objRec.
als je voor die regel kijkt of BOF of EOF is dan zal je zien dat dat zo is.

Dat was trouwens ook al gezegd in dit topic.

Het is toch geen oplossing om je recordset dan maar te closen en weg te gooien als hij de melding geeft dat je hem probeert te benaderen. Dan probeert je script hem nog steeds te benaderen maar bestaat hij niet meer. Daarom je 2e foutmelding.

Je moet zelf wel een beetje moeite doen om je script te debuggen hoor. We gaan hier niet alles voor je voorkauwen.

[ Voor 46% gewijzigd door Woy op 17-08-2005 14:46 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Zoals reeds eerder gezegd doe je een MoveNext in een for-lus, zonder enige controle. Is dit echt wel nodig ? Zo ja, dan zou je het kunnen oplossen met de volgende ( niet zo nette) workaround : Zet net na de MoveNext de regel
code:
1
  if objRec.eof then exit for


Maareh, WAT probeer je nu precies te doen in deze code ???

[ Voor 12% gewijzigd door Verwijderd op 17-08-2005 15:00 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik denk dat het al veel eerde fout gaat aangezien hij niet eens op BOF checkt maar dat weet ik niet zeker aangezien ik nooit in vb programmeer

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Tja, ik ben heel de dag al zo ongeveer hiermee bezig.... probeer allerlei dingen, maar het wil gewoon niet lukken.. :( Zal wel weer aan mij liggen, maargoed.

Wat ik hier nou precies mee wilt bereiken is ervoor te zorgen dat hij maximaal een X aantal rijen op een pagina laat zien, zodat het allemaal wat overzichtelijk wordt....

Proud member of the Cosmic Cows


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 15:44

Cyphax

Moderator LNX
Verwijderd schreef op woensdag 17 augustus 2005 @ 15:00:
Zoals reeds eerder gezegd doe je een MoveNext in een for-lus, zonder enige controle. Is dit echt wel nodig ? Zo ja, dan zou je het kunnen oplossen met de volgende ( niet zo nette) workaround : Zet net na de MoveNext de regel
Doe het liever anders, zet het in een loopje, zoiets:
code:
1
2
3
4
Do While Not Recordset.EOF
  ...
  Recordset.MoveNext
Next

Kan haast niet mis gaan.
Theske schreef op woensdag 17 augustus 2005 @ 15:34:
Tja, ik ben heel de dag al zo ongeveer hiermee bezig.... probeer allerlei dingen, maar het wil gewoon niet lukken.. :( Zal wel weer aan mij liggen, maargoed.

Wat ik hier nou precies mee wilt bereiken is ervoor te zorgen dat hij maximaal een X aantal rijen op een pagina laat zien, zodat het allemaal wat overzichtelijk wordt....
Maximaal x aantal? Doe dat dan met de query gelijk. Niet "select *" maar "select top 10 *" ofzo.

[ Voor 36% gewijzigd door Cyphax op 17-08-2005 15:38 ]

Saved by the buoyancy of citrus


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Cyphax schreef op woensdag 17 augustus 2005 @ 15:37:

[...]

Maximaal x aantal? Doe dat dan met de query gelijk. Niet "select *" maar "select top 10 *" ofzo.
Ja sorry, ik bedoel een max aantal per pagina. dus dat op de volgende pagina de volgende 10 worden weergeven enz....

Proud member of the Cosmic Cows


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:38

TeeDee

CQB 241

Dus je wilt een paging recordset?

MSDN artikel
Google zoekwoorden

[ Voor 74% gewijzigd door TeeDee op 17-08-2005 15:56 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 15:44

Cyphax

Moderator LNX
Theske schreef op woensdag 17 augustus 2005 @ 15:48:
[...]


Ja sorry, ik bedoel een max aantal per pagina. dus dat op de volgende pagina de volgende 10 worden weergeven enz....
Dat kun je ook met SQL doen, ofschoon het een beetje een omweg is met SQL server. Ik heb dat eens zo ongeveer opgelost:
"select top " & pagesize & " * from [tabel] where [idveld] not in (select top " & pagesize * pagenr & " * from [tabel] where [idveld]=" & id & ")" waarbij die pagesize, page en id uit de querystring komen bijvoorbeeld. Probeer het maar.

Saved by the buoyancy of citrus


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Ja idd, dat is wat ik wil hebben!
Ik dacht al zoiets te hebben.. totdat ik deze errors kreeg. Dus ik had daar al enige research naar gedaan over hoe je dit precies kon verkrijgen in asp. In php is het me een tijd al wel gelukt, maar dat even terzijde.
Dus ik kan of nu helemaal opnieuw gaan beginnen, of de fout proberen op te sporen en op te lossen.....

Proud member of the Cosmic Cows


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 11:38

TeeDee

CQB 241

"Helemaal opnieuw beginnen" lijkt erger dan het is imho.
Als de code in je TS alles is, dan lijkt het me niet zo een heel groot probleem om het aan te passen.

Kijk voor de grap in dit topic: Nieuwe werkgever maakt 'slechte' software. en beslis dan of je opnieuw wilt beginnen.

beter nu "helemaal" goed doen, dan alleen pleisters overal opplakken en later niet meer weten wat wat doet.
Ontopic: glad to be of service ;)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Sorry hoor maar zo moeilijk is het toch niet om te debuggen?
In deze code krijg je op regel 2 een fout
ASP:
1
2
3
4
5
6
7
If NOT objRec.EOF Then
        If objRec.Fields("tussenvoegsels").Value <> "" Then
            varGebruikerNaam = objRec.Fields("roepnaam").Value & " " & objRec.Fields("tussenvoegsels").Value  & " " & objRec.Fields("naam").Value 
        Else
            varGebruikerNaam = objRec.Fields("roepnaam").Value & " " & objRec.Fields("naam").Value     
        End If
    End If

Hij zegt dat je Recordset EOF of BOF is. aangezien je op regel 1 controleert of het EOF is zal het dus wel BOF zijn. Mischien sta je dus nog voor het eerste record. Als je gewoon een objRec.MoveNext daarvoor doet dan zal die fout waarschijnlijk gewoon opgelost zijn.

Zo moeilijk is het toch niet om een duidelijke foutmelding die je krijgt te interpreteren. Je krijgt tenslotte een regel erbij en wat er mis gaat ( ok zijn nog 2 opties ) dus dan kan je dat toch gewoon controleren. Dat heet nou debuggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Tja, ik doe m'n best om het proberen te debuggen.. maar met mijn nog geringe kennis van asp gaat het niet nog zo snel en goed als de meeste van jullie het doen.

Verder was trouwens de code die ik eerder melde niet de gehele code van de pagina, maar ik zal morgen verder kijken wat ik ermee kan doen. Bedankt in ieder geval voor jullie reacties en ik hoop dat ik er zo wel uitkom!
Ik wordt er in ieder geval steeds wijzer van ;)

Proud member of the Cosmic Cows

Pagina: 1