Toon posts:

[ASP] Fout bij geen resultaten uit DB

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zie het echt niet meer!!!

Ik wil checken;

Ten eerste of er GEEN rijen van uit mijn query worden gepoept dan tekstje;
If rs.EOF And rs.BOF Then
Response.Write("Er zijn geen artikelen in deze categorie.")

Anders;
Else rs.MoveFirst
While Not rs.EOF

Dit werkt leuk als er data is, echter geen resultaat is de bekende;

Either BOF or EOF is True, or the current record has been deleted.
Requested operation requires a current record.
/select_artikel.asp, line 17 })

Ik zie geen fout in mijn scriptje! Kijk er nou al te lang na, waardoor ik het denk ik ook niet meer zal zien.
Wie o wie is hier scherp?

<Scriptje>

<%
Dim conn, rs
Set conn=Server.CreateObject("ADODB.Connection")
Call conn.Open("DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" &
Server.Mappath("/Restricted/Basis.mdb"))


Set rs = Server.CreateObject("ADODB.Recordset")

Call rs.Open ("SELECT * FROM tblArt " & _
"WHERE Categorie = '" & Request.Querystring("categorie") & "'", conn)


Call rs.MoveFirst() ---> Fout op deze regel; is nummertje 17 8)7 8)7 8)7
%>

html meuk

<%
If rs.EOF And rs.BOF Then
Response.Write("Er zijn geen artikelen in deze categorie.")

Else rs.MoveFirst
While Not rs.EOF
%>

html meuk

<%
rs.MoveNext
Wend
End If

rs.close
conn.close
%>

</Scriptje>

Mijn dank is bij voorbaat groot! _/-\o_ _/-\o_

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

Check op rs.RecordCount..

Download my music on SoundCloud


  • Ullie
  • Registratie: December 2004
  • Niet online
Je kunt niet naar een record gaan wat niet bestaat. Je moet daarom eerst een controle doen of rs.BOF of rs.EOF true is. Opzich is in deze situatie de regel waarin de fout optreedt overbodig

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:12

gorgi_19

Kruimeltjes zijn weer op :9

Sloop regel 17 er gewoon volledig uit?

* gorgi_19 gaat niets meer zeggen over SQL Injection; wees niet verbaasd als mensen je database volledig leeg gaan slopen.

[ Voor 62% gewijzigd door gorgi_19 op 22-03-2005 21:52 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Call rs.MoveFirst() heb ik nu ge'outcomment, maar nog steeds zelfde melding. snap het niet.

Verwijderd

Verwijderd schreef op woensdag 23 maart 2005 @ 10:03:
Call rs.MoveFirst() heb ik nu ge'outcomment, maar nog steeds zelfde melding. snap het niet.
Degene in regel 17?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:12

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op woensdag 23 maart 2005 @ 10:03:
Call rs.MoveFirst() heb ik nu ge'outcomment, maar nog steeds zelfde melding. snap het niet.
Lijkt me idd erg sterk; als je er een comment van hebt gemaakt, dan kan hij geen foutmelding geven.
die tweede rs.MoveFirst mag er imho ook wel uit, doet ook weinig nuttigs.

[ Voor 12% gewijzigd door gorgi_19 op 23-03-2005 10:14 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
Het openen van de recordset zoals dat nu gebeurd is adOpenForwardOnly (de default als je niets meegeeft). Bij dit type recordset kan je dus geen MoveFirst gebruiken.

Je moet dus iets anders gebruiken: adOpenKeyset = 1, adOpenStatic = 3. Aangezien het ASP is heb ik ff de getallen erachter gezet.

  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
zoiets dus:
code:
1
2
Call rs.Open ("SELECT * FROM tblArt " & _
"WHERE Categorie = '" & Request.Querystring("categorie") & "'", conn, 3)

[ Voor 28% gewijzigd door Ashtaroth op 23-03-2005 11:11 ]


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Stop AI Slop

Waarom gebruik je .EOF en .BOF?

Ik gebruik alleen .EOF, werkt best.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Verwijderd

Topicstarter
Jongens,

Alvast bedankt voor de terugkoppeling.

Ennuh ik wil If BOF+EOF = true Then <html> bla bla geen artikelen bla bla </html>
anders <html> uitspugen </html>

  • Tinoo
  • Registratie: Januari 2005
  • Laatst online: 09-01 16:14
Heb ooit een keer zo'n probleem gehad.
De oplossing was toen het gebruik van haakjes, dus:

if (rs.EOF and rs.BOF) Then
response.write "Blahdieblah"
end if

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

als je niet eerst probeert te moven door je rs, dan is rs.EOF genoeg hoor :)
BOF voegt dan echt niets toe.

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Verwijderd

Topicstarter
Hoe zit het dan met mijn While Not rs.EOF? Als dus rs.EOF = true, wordt onderaan pagina nog meuk gegooid die ik niet wil hebben.

Ik heb dus net veranderd naar;

If rs.EOF Then

html prut

Else
While Not rs.EOF

Nog steeds foutmelding bij lege resultaat, loopt allen niet meer te zeiken over regel 17. het is nu nog alleen;
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
/select_artikel.asp

Die hele If-statement werkt van geen centimeter!!!!

[ Voor 61% gewijzigd door Verwijderd op 23-03-2005 14:29 ]


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Stop AI Slop

Hier:

code:
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
<%
Dim conn, rs
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" &
Server.Mappath("/Restricted/Basis.mdb")


Set rs = Server.CreateObject("ADODB.Recordset")

set rs = conn.execute ("SELECT * FROM tblArt " & _
"WHERE Categorie = '" & Request.Querystring("categorie") & "'", conn)

%>

html meuk

<%
If rs.EOF Then
Response.Write("Er zijn geen artikelen in deze categorie.")

Else 

  Do While Not rs.EOF
    %>
    html meuk
    <%
    rs.MoveNext
  Loop

End If

rs.close
conn.close
%>


Moet werken ;)

Edit: ik houd niet van Call :P Is onnodig, legacy support.

[ Voor 18% gewijzigd door CodeCaster op 23-03-2005 14:21 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Verwijderd

Topicstarter
code:
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
<%
  If rs.EOF Then 
%>
    <p>Er zijn geen artikelen in deze categorie<br />
    <a href="zoekform_artikel.asp" target="_self">&lt;&nbsp;&nbsp;terug naar categorie&euml;n</a><br />
    <a href="Default.asp" target="_self">&lt;&lt;&nbsp;terug naar hoofdmenu</a>
    </p>
<%
  Else
    While Not rs.EOF
%>
            <tr>
                <td colspan="2" bgcolor="#CCCCCC"><h3><% =rs("Omschrijving")%></h3></td>
            </tr>
            <tr>
                <td width="25%">[img]"images/webwinkel/<%[/img]/<% =rs("Plaatjes")%>" width="<% =rs("Plaatjes_breedte")%>" heigth="<% =rs("Plaatjes_lengte")%>"></td> 
                <td width="75%">
                        <table width="50%" Align="left">
                            <tr>
                                <td>&euro;<% =rs("Prijs") %></td>
                            </tr>  
                            <tr>
                                <td><a href="delete_artikel.asp?id=<% =rs("ArtCode")%>">Delete</a></td>
                            </tr>
                            <tr>  
                                <td><a href="updateform_artikel.asp?id=<% =rs("ArtCode")%>">Update</a></td>
                            </tr>
                        </table>
                </td>
            </tr>
  
<%
    rs.MoveNext
    Wend
  End If

  rs.close
  conn.close


Werkt ook niet!

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-05 09:43

Jaspertje

Max & Milo.. lief

Als dat ook niet werkt, kan je het ook nog in een Array zetten misschien met Defined_Arr = rs.GetRows..

Daarna met een Ubound(Defined_Arr, 2) >0 bepalen of er wel records zijn en daarna dat hele ding gaan doorlopen met een for i = 0 to Ubound(Defined_Arr, 2)..

----
access, weet niet of die dit ondersteunt...

[ Voor 10% gewijzigd door Jaspertje op 23-03-2005 14:50 ]


Verwijderd

Topicstarter
Sorry Jaspertje,

Ik ben een ASP-n00b ik begrijp niet wat je bedoelt. Zou je het duidelijk kunnen uitleggen, dus op n00b- level?

  • Tinoo
  • Registratie: Januari 2005
  • Laatst online: 09-01 16:14
hmm, heb je het nou al met die haakjes geprobeerd? Ben er toch vrij zeker van dat dit wel werkt :|

Verwijderd

Topicstarter
Tinoo, heb ik ook gedaan. Er komt hier nog wel een Else en While Not bij hè.

Ik zal trouwens voor de zekerheid ff de hele asp-code erin gooien. Dadelijk zegt iemand; "ja, maar dat en dit ben je vergeten!!!

code:
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
<html>
    <body>
<%
  Dim conn, rs
  'Stap 1: Connectie openen
  Set conn=Server.CreateObject("ADODB.Connection")
  Call conn.Open("DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.Mappath("/Secure/SuccosDB.mdb"))

  'Stap 2: Recordset initialiseren
  Set rs = Server.CreateObject("ADODB.Recordset")

  'Stap 3: Recordset uitvoeren mbv SQL
  Call rs.Open ("SELECT * FROM tblArtikelen " & _
        "WHERE Categorie = '" & Request.Querystring("categorie")  & "'", conn)

%>

        <table border="0" width="50%" cellpadding="0" Cellspacing="0" align="center">
            <tr>
                <td colspan="2" bgcolor="#849cca"><h2>Categorie <% =rs("categorie")%></h2></td>
            </tr>
<%
  If rs.EOF Then 
%>
            <tr>
                <td colspan="2">Er zijn geen artikelen in deze categorie</td>
            </tr>
<%
  Else
    While Not rs.EOF
%>
            <tr>
                <td colspan="2" bgcolor="#CCCCCC"><h3><% =rs("Omschrijving")%></h3></td>
            </tr>
            <tr>
                <td width="25%">[img]"images/webwinkel/<%[/img]/<% =rs("Plaatjes")%>" width="<% =rs("Plaatjes_breedte")%>" heigth="<% =rs("Plaatjes_lengte")%>"></td> 
                <td width="75%">
                        <table width="50%" Align="left">
                            <tr>
                                <td>&euro;<% =rs("Prijs") %></td>
                            </tr>  
                            <tr>
                                <td><a href="delete_artikel.asp?id=<% =rs("ArtCode")%>">Delete</a></td>
                            </tr>
                            <tr>  
                                <td><a href="updateform_artikel.asp?id=<% =rs("ArtCode")%>">Update</a></td>
                            </tr>
                        </table>
                </td>
            </tr>
  
<%
    rs.MoveNext
    Wend
  End If

  'Stap 5: Recordset en Connectie sluiten
  rs.close
  conn.close
  
%>
            <tr>
                    <td colspan="2" bgcolor="#EEEEEE"><a href="insertform_artikel.asp" target="_self">Artikel toevoegen</a> ( hiervoor dient u ingelogd te zijn.)</td>
            </tr>
            <tr>
                    <td colspan="2">&nbsp;</td>
            </tr>
            <tr>
                    <td colspan="2">&nbsp;&nbsp;&nbsp;<a href="zoekform_artikel.asp" target="_self">&lt;&nbsp;&nbsp;terug naar categorie&euml;n</a></td>
            </tr>
            <tr>
                    <td colspan="2"><a href="Default.asp" target="_self">&lt;&lt;&nbsp;terug naar hoofdmenu</a></td>
            </tr>
        </table>
    </body>
</html>

[ Voor 95% gewijzigd door Verwijderd op 23-03-2005 15:24 ]


Verwijderd

Je query is leeg (error), dan kan je er ook niet door heen loopen (er is geen BOF of EOF).
Geef je wel een categorie op voor de query ? Hij verwacht een "Request.Querystring("categorie")"

Je kunt bijv. 2 dingen doen ipv de
code:
1
2
If rs.EOF Then
Response.Write("Er zijn geen artikelen in deze categorie.")

vervangen door;
code:
1
2
If Request.Querystring("categorie") = "" Then
Response.Write("Er zijn geen artikelen in deze categorie.")

Je moet checken of die Request.Querystring leeg is of niet, als ie leeg is dan zal je query nooit werken. Je kunt die If ook om de hele query+connection heenzetten, ben je van het gelazer af.

Kan je ook nasty oplossen, door een On error resume next erin te gooien.

Maar zoals Jaspertje al zei; een array is beter en veel sneller. Zie 4guysfromrolla

[ Voor 20% gewijzigd door Verwijderd op 24-03-2005 08:56 ]


Verwijderd

Topicstarter
In dit geval is niet als de Request.Querystring leeg is in de IF-statement moeten komen, maar als de output van de SQL-query een leeg resultaat oplevert.
Zou het ook kunnen dmv. 2de Query te maken en daar de aantal rijen te tellen? Als rs2de=0 Then?!

Of zoiets :9 :9

  • Tinoo
  • Registratie: Januari 2005
  • Laatst online: 09-01 16:14
Schoot me net wat te binnen, draai de hele boel gewoon om.

Dus iets in de trant van:

Visual Basic:
1
2
3
4
5
If not (rs.EOF and rs.BOF) Then
     'code voor als er wel data is
Else
     Response.write("geen data")
end if


Bij een lege recordset zijn zowel BOF als EOF waar, daar ben ik zeker van.

  • G-RaX
  • Registratie: Mei 2000
  • Laatst online: 05-04 17:44

G-RaX

Unofficial TopCat

Kun je niet gewoon zoiets doen?

code:
1
2
3
4
5
6
7
Do While Not rs.EOF
 If rs.EOF Then Exit Do
  
 'Output van rs
 
rs.MoveNext
Loop

[ Voor 19% gewijzigd door G-RaX op 24-03-2005 12:56 ]


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Dat is een nutteloos if statement, want hij loopt al niet meer als rs.EoF.

Verwijderd

Met een array.
code:
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
<%
connection_STRING = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.Mappath("/Secure/SuccosDB.mdb"))

Set objCon = createObject("ADODB.connection")
Set objRS1 = createObject("ADODB.recordset")

objSQL1 = "SELECT * FROM tblArtikelen WHERE Categorie = '" & Request.Querystring("categorie")  & "'"

objCon.open connection_STRING
objRS1.open objSQL1, objCon

if NOT objRS1.EOF AND NOT objRS1.BOF then
 querydata = objRS1.getrows
 else
 nodata = true
end if

objRS1.close
set objRS1 = nothing
set objCon = nothing
%>

<% If nodata = true Then %>
<tr>
  <td colspan="2">Er zijn geen artikelen in deze categorie</td>
</tr>
<% Else %>

<% For x = lbound(querydata,2) to ubound(querydata,2) %>

html output :

aanspreken met <%=querydata(0,x)%>
waarbij de 0 de kolom representeert.

<% Next %>
<% End if %>

[ Voor 14% gewijzigd door Verwijderd op 24-03-2005 13:44 ]


Verwijderd

Topicstarter
Ik kwam zelf met dit idee, heb alleen nog geen tijd gehad om uit te testen;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Call rsTel.Open ("SELECT COUNT(*) AS aantal FROM tblArtikelen " & _
        "WHERE Categorie = '" & Request.Querystring("categorie")  & "'", conn)

%>
             <html-modus> bla bla bla bla</html-modus>
<%
  If rsTel("aantal")=0 Then
%>
              <html-modus> bla bla bla bla</html-modus>
<%
  rsTel.close

  Else
  
    Set rsSho= Server.CreateObject("ADODB.Recordset")
     'Stap 3: Recordset uitvoeren mbv SQL
     
    Call rsSho.Open ("SELECT * FROM tblArtikelen " & _
        "WHERE Categorie = '" & Request.Querystring("categorie")  & "'", conn)    
    While Not rsSho.EOF
%>
             <html-modus> bla bla bla bla</html-modus>

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Ik denk niet dat een array wat uit gaat halen.Als er geen records geretourneerd worden, krijg je gewoon een lege recordset terug. Dat kun je echt gewoon opvangen met een rs.Eof.

Hieronder een stukje code zoals ik het meestal doe (behalve wanneer ik te maken heb met userinput, dan gebruik ik geparameteriseerde queries om SQL-injection te voorkomen ;) )
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim oConn, oRS, sSQL
Set oConn = Server.createObject( "ADODB.Connection" )
  oConn.Open "<INSERT CONNECTION STRING HERE>"

  sSQL = "SELECT blah FROM tbl_blah WHERE blah='1234'"
  Set oRS = oConn.Execute( sSQL )

    If ( oRS.Eof ) Then
      ' Voer hier wat code uit, bijvoorbeeld:
      Response.Write "De query heeft geen records geretourneerd"
    End If

    Do While Not oRS.Eof
      'Doe hier iets met de records, bijvoorbeeld:
      Response.Write oRS( "blah" ) & "<br>" & vbCrLf
      oRS.moveNext
    Loop

    oRS.Close
  Set oRS = Nothing

  oConn.Close
Set oConn = Nothing

Wanneer de recordset geen resultaten retourneert, print hij de tekst: "De query heeft geen records geretourneerd". Worden er geen records geretourneerd, dan komt'ie ook niet binnen de do...loop terecht, waardoor je geen foutmelding betreffende EOF of BOF kunt krijgen.

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Verwijderd

wizzkizz schreef op vrijdag 25 maart 2005 @ 18:03:
Ik denk niet dat een array wat uit gaat halen.
De array werkt veel sneller (scheelt een berg calls naar je database, je hebt er met een array om precies te zijn maar 1 nodig), plus dat de ondervanging van de lege query er in zit.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%
if NOT objRS1.EOF AND NOT objRS1.BOF then
 querydata = objRS1.getrows
 else
 nodata = true
end if
%>
...
<% If nodata = true Then %>
<tr>
  <td colspan="2">Er zijn geen artikelen in deze categorie</td>
</tr>
<% Else %>
.....
<% end if %>

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Verwijderd schreef op vrijdag 25 maart 2005 @ 19:27:
[...]

De array werkt veel sneller (scheelt een berg calls naar je database, je hebt er met een array om precies te zijn maar 1 nodig)
Met snelheid heb je zeker een punt. Maar voor het gebruikersgemak (TS gaf aan niet heel ervaren te zijn in ASP) is het imo voor TS toch beter om het zonder getRows() te doen.
Je hoeft niet te extra te communiceren met je DB, je recordset is niet meer afhankelijk van de DB. Je kunt de DB verbinding in principe dus sluiten zodra je je recordset opgehaald hebt.
Verwijderd schreef op vrijdag 25 maart 2005 @ 19:27:
plus dat de ondervanging van de lege query er in zit.
Het ondervangen van lege queries is op mijn manier ook helemaal geen enkel probleem.

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.

Pagina: 1