Toon posts:

[ASP+ODBC] Probleem met clienttaken

Pagina: 1
Acties:
  • 123 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een database die gevuld is met registratienummers van onze medewerkers. Maar ik heb een functie gemaakt die er voor zorgt dat het registratienummer wordt omgezet naar de bijbehorende naam.

Maar als ik nu de database wilt uitlezen dan krijg ik de volgende foutmelding:
code:
1
2
3
4
5
Microsoft OLE DB Provider for ODBC Drivers error '80040e4d' 

[Microsoft][ODBC Microsoft Access-stuurprogramma] Te veel clienttaken. 

/ia/Personeel/RegnummerNaarNaam.asp, line 14

Ik heb ook al met Application.Lock en Unlock gewerkt maar dan geeft hij nog steeds de zelfde fout! hoe kan ik dit oplossen, want dat is best irritant!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Gebruik je een systeem-DSN?

Zo ja, kijk dan eens naar http://www.powerasp.com/content/database/dsn_vs_dnsless.asp

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Ja jammer joh, ik zou eens SQL gaan gebruiken of zo. Access via ODBC kan gemiddeld ong 50 users aan. Je zou ook kunnen proberen om UDL bestand te gebruiken ipv een ODBC koppeling. En anders word het gewoon 5000 pieken neergooien voor SQL2000 licensie.

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

laat anders eens wat code zien? wat gebeurt er op regel 14 :?
(misschien is er een andere aanpak mogelijk..)

kaart != map && bottel != fles
Wacht op antwoord


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 03-09 23:48
Misschien vergeet je het connection en/of recordset object te sluiten en op nothing te zetten.

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 00:35

oZy

Op woensdag 27 maart 2002 17:02 schreef voetenzalf het volgende:
Ja jammer joh, ik zou eens SQL gaan gebruiken of zo. Access via ODBC kan gemiddeld ong 50 users aan. Je zou ook kunnen proberen om UDL bestand te gebruiken ipv een ODBC koppeling. En anders word het gewoon 5000 pieken neergooien voor SQL2000 licensie.
Waaruit maak jij op dat GTI_RI geen SQL gebruikt? :? En gelijk overstappen van MS Access naar MS SQL Server 2000 is wel erg rigoreus.

Tune je code! Laat anders je script zien zodat we je kunnen helpen. Het is ook nog niet helemaal duidelijk wat je nu precies doet, maar volgens mij heb je een lijst met registratie nrs en een lijst met medewerkers, en probeer je deze 2 samentevoegen. Als dat alles is, dan is het helemaal niet noodzakelijk om van MDB af te stappen. Je kan het desnoods partitioneren door steeds 25 (ik noem maar wat) records per keer te doen, daarna alles te sluiten en dan de volgende serie te pakken. Al denk ik niet dat dit nodig is.

Mocht ik er naast zitten en betreft het wel een veel geraadpleegde bron, die ook nog eens je MDB zwaar belast, dan kun je altijd nog overstappen op de gratis Microsoft Desktop Engine (MSDE, een gestripte versie van MS SQL Server). Zoek op GOT/MSDN maar even op MSDE.

Verwijderd

Topicstarter
Ok, hier is zijn de code's:

Dit is de RegnummerNaarNaam.asp (Wordt met een Include opgeroepen)
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
<% Response.Buffer = True %>
<%
'Response.Write RegnummerNaarNaam(Request.QueryString("regnum"))

Function RegnummerNaarNaam(RegNum)
    If RegNum <> "" then
        set DBConn_RegnummerNaarNaam = server.createobject("ADODB.connection")
        set rs_RegnummerNaarNaam = Server.CreateObject("ADODB.Recordset")
        DSN_CONNSTRING="DRIVER={Microsoft Access Driver (*.mdb)}; "
        DSN_CONNSTRING=DSN_CONNSTRING & "DBQ=" & server.mappath("/dbase1/Personeel/pgegevens.mdb")

        Application.Lock

        DBConn_RegnummerNaarNaam.Open DSN_CONNSTRING
    
        SQLstring = "SELECT * FROM PersoneelGegevens WHERE Regnummer LIKE '" & RegNum & "'"
        
        rs_RegnummerNaarNaam.Open SQLstring, DBConn_RegnummerNaarNaam, adOpenStatic, adLockReadOnly, adCmdText  
    
        If rs_RegnummerNaarNaam.RecordCount = 0 Then
            Response.Write "#FOUT!!!#"
        Else
            AchternaamVoornaam = 1
        
            If AchternaamVoornaam = 1 Then
                If RS_RegnummerNaarNaam("Tussenvoegsel") = "" then 
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Achternaam") & ", " & RS_RegnummerNaarNaam("Voornaam")
                Else
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Achternaam") & ", " & RS_RegnummerNaarNaam("Voornaam") & " " & RS_RegnummerNaarNaam("Tussenvoegsel")
                End if
            Else
                If RS_RegnummerNaarNaam("Tussenvoegsel") = "" then 
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Voornaam") & " " & RS_RegnummerNaarNaam("Achternaam")
                Else
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Voornaam") & " " & RS_RegnummerNaarNaam("Tussenvoegsel") & " " & RS_RegnummerNaarNaam("Achternaam")
                End if
            End If
            
            RS_RegnummerNaarNaam.close
            set RS_RegnummerNaarNaam = nothing
            DBConn_RegnummerNaarNaam.close
            set DBConn_RegnummerNaarNaam = nothing
            Application.Unlock
        End If
    Else
        RegnummerNaarNaam = RegNum
    End If
End Function
%>

En dit is de code die eerst een andere database leeghaalt met onderandere alle regnummers van de medewerkers. Daarna worden ze met de include file (zie boven) met RegnummerNaarNaam(xxx) omgezet:
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
LET OP, IK HEB DELEN CODE WEGGELATEN DIE NIET BELANGRIJK ZIJN!!!
<% Session.LCID = 1043 %>
<!--#include virtual="/ia/include/MaakKey.asp"-->
<!--#include virtual="/ia/include/reset_tijd.asp"-->
<!--#include virtual="/ia/include/RegnummerNaarNaam.asp"-->
<!--#include virtual="/ia/include/DebnummerNaarNaam.asp"-->
<!--#include virtual="/ia/include/ValutaMaken.asp"-->
<%
Response.Cookies("GTIGK")("aoofgo") = "ao"
Response.Cookies("GTIGK").Expires = DateAdd("yyyy", 1, Date())

'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3

'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4

'---- CommandTypeEnum Values ----
Const adCmdUnknown = &H0008
Const adCmdText = &H0001
Const adCmdTable = &H0002
Const adCmdStoredProc = &H0004
Const adCmdFile = &H0100
Const adCmdTableDirect = &H0200

Dim PageLength, NumPages, CurrentPage

SQL_STRING = "SELECT * FROM GeleKaart ORDER BY Right(Space(10) & OrderNummer, 10)"

DSN_CONN_STRING="DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN_CONN_STRING=DSN_CONN_STRING & "DBQ=" & server.mappath("/dbase1/Gelekaart/Geboortebewijs.mdb")

set DB_CONN=server.createobject("ADODB.Connection")
DB_CONN.Open DSN_CONN_STRING


Set RS = Server.CreateObject("ADODB.Recordset")
RS.Open SQL_STRING, DB_CONN, adOpenStatic, adLockReadOnly, adCmdText
%>
<meta http-equiv="Content-Language" content="nl">
<title>GTI - GeleKaart</title>
<body bgproperties="fixed" background="/images/gr_wt_achter.gif">
<div align="center">
  <center>
<table border=0 cellpadding="1">

<%
Function HTML1()
    Response.Write "<td bgcolor=""#000080""><font face=""Verdana"" size=""2"" color=""#FFFFFF""><b>"
End Function
Function HTML2()
    Response.Write "</b></font></td>"
End Function
Function HTML3()
    Response.Write "<td Style=""cursor:hand"" OnClick=""javascript:location.href='subnummer.asp?onum=" & RS("OrderNummer") & "'"" valign=top bgcolor=""#F5F5F5""><font face=""Courier New"" size=""2"">"
End Function
Function HTML4()
    Response.Write "</font></td>"
End Function
Function HTML5()
    Response.Write "<td Style=""cursor:hand"" OnClick=""javascript:location.href='subnummer.asp?onum=" & RS("OrderNummer") & "'"" valign=top bgcolor=""#FFFFCC""><font face=""Courier New"" size=""2"">"
End Function
Function HTML6()
    Response.Write "</font></td>"
End Function 
%>
<tr>
    <%if Request.Cookies("GTIGK")("WeergOrderNummer") = "1" then%><%HTML1%>OrderNummer<%HTML2%><%end if%>
    <%if Request.Cookies("GTIGK")("WeergSubNummer") = "1" then%><%HTML1%>SubNummer<%HTML2%><%end if%>
    <%if Request.Cookies("GTIGK")("WeergProjectNaam") = "1" then%><%HTML1%>ProjectNaam<%HTML2%><%end if%>
    ....
    ....
    <%if Request.Cookies("GTIGK")("WeergUurloonOntwerp") = "1" then%><%HTML1%>UurloonOntwerp<%HTML2%><%end if%>
    <%if Request.Cookies("GTIGK")("WeergPrestatietoeslagProcent") = "1" then%><%HTML1%>PrestatietoeslagProcent<%HTML2%><%end if%>
</tr>

<%
' Lees de records
    'RecordCount = 0
    'Do While RecordCount < PageLength
    Do While Not RS.eof
%>
    <%WitOgGeel = 0%>
    <%If WitOfGeel = 1 then%>
        <tr>
            <%if Request.Cookies("GTIGK")("WeergOrderNummer") = "1" then%><%HTML3%><%=RS("OrderNummer")%><%HTML4%><%end if%>
            ....
            <%if Request.Cookies("GTIGK")("WeergProjectleider") = "1" then%><%HTML3%><%=RegnummerNaarNaam(RS("Projectleider"))%><%HTML4%><%end if%>
            <%if Request.Cookies("GTIGK")("WeergWerkvoorbereider") = "1" then%><%HTML3%><%=RegnummerNaarNaam(RS("Werkvoorbereider"))%><%HTML4%><%end if%>
            <%if Request.Cookies("GTIGK")("WeergAssWerkvoorbereider") = "1" then%><%HTML3%><%=RegnummerNaarNaam(RS("AssWerkvoorbereider"))%><%HTML4%><%end if%>
            .... -----------------------------------------------------------------------------] Hierboven wordt de functie aangeroepen!
        </tr>
    <%WitOfGeel = 2%>
    <%else%>
    
        <tr>
            <%if Request.Cookies("GTIGK")("WeergOrderNummer") = "1" then%><%HTML5%><%=RS("OrderNummer")%><%HTML6%><%end if%>
            .....
            .....
        </tr>
        <%WitOfGeel = 1%>
    <%end if%>
<% 
    
        if Not RS.eof then
            RS.movenext
        end if
    loop

RS.close
set RS = nothing
DB_CONN.close
set DB_CONN = nothing
%>

....
....

Dus nog even een herhaling wat mijn scripts doen:
Ik vertoon met bovenstaande script een lijst met ALLE gegevens uit de database Geboortebewijs.mdb In die database staat het personeel niet met naam opgeslagen maar met hun registratienummer. Nu zorg ik met de Include RegnummerNaarNaam dat de registratienummers met een Function (RegnummerNaarNaam(xxx)) worden omgezet naar een naam.

edit:

Ik nog even geteld, maar 38 keer zet hij netjes de regnummer naar een Naam en bij de 39e keer geeft hij de foutmelding! |:(

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

ok, je roept je functie een keer of wat aan. In de functie maak je telkens een connectie aan...
als je nu een keer voor het aanroepen van de functie die connectie aanmaakt, en die gewoon in de functie gebruikt, scheelt dat denk ik al een heleboel ;)

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

Topicstarter
Op donderdag 28 maart 2002 09:41 schreef j_du_pee het volgende:
ok, je roept je functie een keer of wat aan. In de functie maak je telkens een connectie aan...
als je nu een keer voor het aanroepen van de functie die connectie aanmaakt, en die gewoon in de functie gebruikt, scheelt dat denk ik al een heleboel ;)
Ik geloof dat het nog vroeg is, want ik kan niet helemaal volgen wat je bedoelt. Dus eigelijk zeg je:

Pagina wordt opgeroepen;
Database Geboortebewijs wordt geopent;
Database Personeelgegevens wordt geopent;
gegevens worden uit de database gehaalt;
Regnummers worden omgezet naar namen ZONDER de db te sluiten;
Databasen worden gesloten;

Als jij bedoelt als bovenstaande dan kan ik geloof ik niet meer een include functie gebruiken, of heb ik het nu mis :?

Ik gebruik namelijk in een hoop asp pagina's de zelfde functie, dus vandaar dat ik een include heb gemaakt!

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

wat ik bedoel is:
code:
1
2
3
4
5
6
con.open geboortebewijs
con.open pzgegevens

do while not rs_geboordebewijs.eof
   functie()
loop

je opent dus niet bij iedere aanroep van de functie een nieuwe connectie, maar je gebruikt degene die buiten de loop geopend hebt

edit:
Als jij bedoelt als bovenstaande dan kan ik geloof ik niet meer een include functie gebruiken, of heb ik het nu mis
je include ziet er dan zo uit:
con.open database

function bla()
'dingen die een functie zoal doen
end function

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

Topicstarter
Volgens mij kan ik geen Function gebruiken als ik de database opent. Ik heb nu het volgende:
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
set DBConn_RegnummerNaarNaam = server.createobject("ADODB.connection")
set rs_RegnummerNaarNaam = Server.CreateObject("ADODB.Recordset")

DSN_CONNSTRING="DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN_CONNSTRING=DSN_CONNSTRING & "DBQ=" & server.mappath("/dbase1/Personeel/pgegevens.mdb")

DBConn_RegnummerNaarNaam.Open DSN_CONNSTRING
SQLstring = "SELECT * FROM PersoneelGegevens WHERE Regnummer"

rs_RegnummerNaarNaam.Open SQLstring, DBConn_RegnummerNaarNaam, adOpenStatic, adLockReadOnly, adCmdText  

do while not rs_geboordebewijs.eof
    Function RegnummerNaarNaam(RegNum)
            AchternaamVoornaam = 1
        
            If AchternaamVoornaam = 1 Then
                If RS_RegnummerNaarNaam("Tussenvoegsel") = "" then 
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Achternaam") & ", " & RS_RegnummerNaarNaam("Voornaam")
                Else
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Achternaam") & ", " & RS_RegnummerNaarNaam("Voornaam") & " " & RS_RegnummerNaarNaam("Tussenvoegsel")
                End if
            Else
                If RS_RegnummerNaarNaam("Tussenvoegsel") = "" then 
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Voornaam") & " " & RS_RegnummerNaarNaam("Achternaam")
                Else
                    RegnummerNaarNaam = RS_RegnummerNaarNaam("Voornaam") & " " & RS_RegnummerNaarNaam("Tussenvoegsel") & " " & RS_RegnummerNaarNaam("Achternaam")
                End if
            End If
    End Function
loop

RS_RegnummerNaarNaam.close
set RS_RegnummerNaarNaam = nothing
DBConn_RegnummerNaarNaam.close
set DBConn_RegnummerNaarNaam = nothing

De volgende foutmelding geeft hij:
code:
1
2
3
4
5
6
7
8
Compilatiefout Microsoft VBScript error '800a03ea' 

Syntaxisfout 

/ia/include/RegnummerNaarNaam.asp, line 15 

Function RegnummerNaarNaam(RegNum)
^

Hoe moet ik het NU weer gaan oplossen, ik wordt er en beetje gek van :r

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Op donderdag 28 maart 2002 09:59 schreef j_du_pee het volgende:
do while not rs_geboordebewijs.eof
functie()
loop[/code]
met functie() bedoelde ik de aanroep van de functie... niet de functie zelf natuurlijk, die zet je buiten de loop

dus zoiets:

open databases
function bla()
'dingetjes
end function

do while not eof
bla()
loop

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

He Ozzy, nou er staat gewoon dat ie Access stuurDing gebruikt.

Je gebruikt toch Access?

Ik ben echt bang dat ik gelijk ga krijgen!

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Op donderdag 28 maart 2002 16:03 schreef voetenzalf het volgende:
He Ozzy, nou er staat gewoon dat ie Access stuurDing gebruikt.

Je gebruikt toch Access?

Ik ben echt bang dat ik gelijk ga krijgen!
wat er volgens mij gebeurt is dat iedere keer dat de loop wordt doorlopen een connectie wordt aangemaakt, cq "gebruiker".

Als de connectie boven de loop wordt geopend is dat probleem volgens mij gewoon opgelost. Wil je hem in de loop laten staan heb je SQL server nodig: dan ben je 5000 piek armer en een ranzig script rijker :)
jij mag kiezen ;)

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

Op donderdag 28 maart 2002 14:14 schreef GTI_RI het volgende:
DSN_CONNSTRING="DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN_CONNSTRING=DSN_CONNSTRING & "DBQ=" & server.mappath("/dbase1/Personeel/pgegevens.mdb")
Allereerst, gebruik OLEDB. Is sneller:

DSN_CONNSTRING="Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source= & server.mappath("/dbase1/Personeel/pgegevens.mdb") & ";" & _
"User Id=admin;" & _
"Password=;"


2. Probeer eens de allereerste recordset (waar je doorheen loopt) in een array te dumpen en daar doorheen te loopen (he, alweer snelheids winst):
Set RS = Server.CreateObject("ADODB.Recordset")
RS.Open SQL_STRING, DB_CONN, adOpenStatic, adLockReadOnly, adCmdText

....
'Do While RecordCount < PageLength
Do While Not RS.eof
'Je loop
Loop

'En opruimen
RS.Close
Set RS = nothing
etc...
wordt dan iets als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Set RS = Server.CreateObject("ADODB.Recordset")
RS.Open SQL_STRING, DB_CONN, adOpenStatic, adLockReadOnly, adCmdText
'Als RS.EOF = FALSE dan vullen we een array met de resultaten
If NOT RS.EOF Then arrayResults = RS.GetRows()
RS.Close
Set rs=nothing
DB_CONN.Close
Set DB_CONN = nothing

If IsArray(arrayResults)   'We hebben resultaten
  For intI = 0 To UBound(arrayResults, 2)  'Begin loop door resultaten
    'Doe wat je ermee wilt
  Next
Else
  Response.Write "Niks gevonden"
End If

Zoals je ziet sluit je veel eerder je database connectie.

Je zou de andere recordset ook in een array kunnen dumpen en dan een loop maken totdat je een goede match hebt.

Verwijderd

:) Het zou kunnen. Maar vreemd genoeg opent ie wel een DB-Con en die sluit ie ook netjes af. Errug vreemd,

Hoeveel gebruikers heb je erop werken, tegelijker tijd. Kijk ook eens naar al je script na of je alle connecties wel goed afsluit! Als er in een include iets open blijft staan dan krijg je inderdaad een opeen hoping van connecties! Dan haal je makkelijk de 50 connecties.
Pagina: 1