Toon posts:

[ASP] subroutines

Pagina: 1
Acties:

Verwijderd

Topicstarter
Gisteren opende ik een topic omdat een code met subroutines niet wilde werken. Omwille van de eenvoud nam ik een voorbeeld over uit een boek over dat wel bleek te werken. (zie hieronder)

Call Doeiets

Sub Doeiets ()
response.write "Hallo wereld"
End Sub

De code die ik eigenlijk wilde proberen is een stuk langer en staat hieronder. Met gewone includes werkt de code wel. IE geeft de volgende fout :
'ADODB.Recordset (0x800A0BB9) De argumenten zijn van het verkeerde type, vallen buiten het toegestane bereik of zijn in conflict met elkaar.'
Fout zit volgens IE in de regel 'rsQuery.Open "SELECT * FROM naam", cnDB, 0, 1 '

Deze beginner doet waarschijnlijk iets elementairs fout, maar kan de oplossing niet vinden. Help needed...

<% Call opendb %>
<% Call openrsQuery %>

<% Do UNTIL rsQuery.EOF %>
<%= rsQuery("naam") %>
<% rsQuery.MoveNext
LOOP %>

</table>
</font>
</body>
</html>
<% Call closersQuery %>
<% Call closedb %>

<% Sub opendb () ' ************* openen van een connectie met de database ********************************' %>

<%
Dim cnDB

Set cnDB = Server.CreateObject("ADODB.Connection")
cnDB.ConnectionString = "Provider=Microsoft.Jet.OleDB.4.0;" _
& "Data Source=D:\gedeeld\test asp\database\bas.mdb"
cnDB.Open
%>

<% End Sub %>
<% Sub openrsQuery () '************* maken van de recordset rsQuery *********************' %>

<%
Dim rsQuery

Set rsQuery = Server.CreateObject("ADODB.Recordset")
rsQuery.Open "SELECT * FROM naam", cnDB, 0, 1
%>

<% End Sub %>

<% Sub closersQuery () '****************** Sluiten recordset rsQuery ***********************' %>

<% rsQuery.Close %>

<% End Sub %>

<% Sub closedb () '****************** Sluiten connectie database ***************************' %>

<% cnDB.Close %>

<% End Sub %>

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Werkt je query als je hem uitvoert in Access of in query analyzer?

Weet je wat de syntax is van een SQL query? Weet je dat je in de FROM clausule de naam van een tabel moet zetten?
Ik heb zo sterk de indruk dat jij daar de naam van een veld gezet hebt.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Dit is helemaal geen probleem met je subroutine, maar eerder met een databaseconnectie.

Ik gok dat het probleem ligt dat je cnDB een private var is, welke niet bereikbaar is buiten de scope van de sub.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Kijk inderdaad eens naar de scope van gebruikte variabelen. De scope is het bereik dat de variabele binnen je code heeft, dwz dat een variabele in sommige delen van de code wel bestaat maar in andere delen niet.

Zet je code in het vervolg tussen code haakjes, zodat het beter leesbaar is. Zie de FAQ voor hoe dat moet.

Succes :)

Edit:
Meer specifiek: je declareert en opent een connectie object cnDB in 1 sub, en geeft hem mee als parameter aan rsQuery.Open in een andere sub, terwijl de variabele daar helemaal niet bestaat.

[ Voor 38% gewijzigd door Verwijderd op 20-05-2003 18:26 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Volgens mij heeft het niet te maken met de scope van die vars, maar met de query.

Ik heb die fout ook al een keer gehad, en toen had ik een foutje in m'n query. (Een veldnaam die niet bestond).

https://fgheysels.github.io/


Verwijderd

Topicstarter
Zoals ik al zei werkt de code wel als ik het openen van de connectie, het aanmaken van de recordset en het sluiten van de recordset in aparte asp-files zet, wel. Ik maak dan gebruik van includes. Ik heb dan wel vier of vijf aparte files en dat wilde ik eigenlijk voorkomen,
De query werkt dus wel en het aanmaken van de recordset is 'by the book', dus ik vermoed dat het niet zondermeer mogelijk is om een connectie te openen en die connectie direct te gebruiken voor het aanmaken van een recordset.
Misschien moet er ergens een soort pauze tussen ofzo?

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Gebruik de debugger eens, en kijk eens op welke regel je precies die fout krijgt.

https://fgheysels.github.io/


Verwijderd

Nee, dat is het niet.

Voorbeeldje van de invloed van scope:
ASP.NET Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%
Dim intA

intA = 1

Sub Rekenen()
   Dim intB 
   intB = 2
   // resultaat zal 1 + 2 = 3 zijn
   Response.Write "In Sub Rekenen: A + B = " & _
      intA & " + " & intB & " = " & intA + intB & "<br>"
End Sub

Call Rekenen()

// resultaat zal 1 + 0 = 1 zijn
Response.Write "Buiten Sub Rekenen: A + B = " & _
   intA & " + " & intB & " = " & intA + intB & "<br>"
%>

Zo zie je dat buiten Rekenen() intB niet bestaat, en daarom default waarde 0 krijgt, dus een ander resultaat oplevert.

Als je Option Explicit boven je code zet voorkom je veel van dit soort vergissingen.

HTH :)

Disclaimer: er kan een foutje in de code zitten, zo uit de losse post getyped, niet geprobeerd

Verwijderd

Topicstarter
MrX heeft helemaal gelijk.
Ik heb de volgende declaraties boven de code gezet:
<%
Dim cnDB
Dim rsQuery
%>
En het werkt.
Dus een declaratie in een sub verliest zijn declaratie daarbuiten. Ik ga die option explicit proberen.
slotje aub!
Pagina: 1