|
| Problem med MoveNext i løkke Fra : Dennis Møller |
Dato : 17-04-05 16:46 |
|
Hej!
En form på en side poster til denne stump kode, der skal opdatere
alle x-antal poster i en tabel i min database. Lad mig starte med
at vise koden:
iCount = CInt(Request.Form("iCount"))
DO
strSQL_priser = "SELECT * FROM priser"
Set rs_priser = Conn.Execute(strSQL_priser)
idnr = rs_priser("id")
strSQL_priser_rediger = "Update priser set "
strSQL_priser_rediger = strSQL_priser_rediger & "navn = '"
& Trim(Replace(Request.Form("navn" & idnr),"'","''" )) & "' , "
strSQL_priser_rediger = strSQL_priser_rediger & "pris = '"
& Trim(Replace(Request.Form("pris" & idnr),"'","''" )) & "' , "
strSQL_priser_rediger = strSQL_priser_rediger & "betaling =
'" & Trim(Replace(Request.Form("betaling" & idnr),"'","''" )) &
"' "
strSQL_priser_rediger = strSQL_priser_rediger & "Where id =
" & idnr
Conn.Execute(strSQL_priser_rediger)
rs_priser.MoveNext
LOOP While Not rs_priser.EOF
iCount har i forvejen talt hvor mange poster, der er i databasen.
Jeg har efter en længerevarende analyse af problemet fundet ud
af, at problemet ligger i, at den ikke udfører MoveNext.
Derfor går serveren kold, da løkken udføres uendelig antal gange.
Så mit spørgsmål lyder: Hvorfor udfører den ikke MoveNext ??
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Tomasz Otap (17-04-2005)
| Kommentar Fra : Tomasz Otap |
Dato : 17-04-05 17:08 |
|
Dennis Møller wrote:
> Så mit spørgsmål lyder: Hvorfor udfører den ikke MoveNext ??
Hej Dennis
Så vidt jeg kan se, udføres din MoveNext fint nok. MEN - din kald til
databasen er indeholdt i selve løkken! Derfor sker der følgende:
1. Løkken starter
2. Du henter data fra databasen: første row i rs indhentes
3. Du opdaterer priser
4. Du rykker til næste row i rs med MoveNext
5. Du looper
6. Du henter data fra databasen IGEN og dermed indhentes første row IGEN
7. osv... i al uendelighed
Du kan i stedet gøre det sådan her:
--------------------
iCount = CInt(Request.Form("iCount"))
strSQL_priser = "SELECT * FROM priser"
Set rs_priser = Conn.Execute(strSQL_priser)
while not rs_priser.eof
idnr = rs_priser("id")
strSQL_priser_rediger = "Update priser set "
strSQL_priser_rediger = strSQL_priser_rediger & "navn = '"
& Trim(Replace(Request.Form("navn" & idnr),"'","''" )) & "' , "
strSQL_priser_rediger = strSQL_priser_rediger & "pris = '"
& Trim(Replace(Request.Form("pris" & idnr),"'","''" )) & "' , "
strSQL_priser_rediger = strSQL_priser_rediger & "betaling =
'" & Trim(Replace(Request.Form("betaling" & idnr),"'","''" )) &
"' "
strSQL_priser_rediger = strSQL_priser_rediger & "Where id =
" & idnr
Conn.Execute(strSQL_priser_rediger)
rs_priser.MoveNext
wend
------------------------
Bemærk dog, at du på den måde foretager en masse databaseopkald for hver
omgang i din løkke. Det er bedre at samle alle data i en fælles
opdateringsstreng, inden den sendes afsted til serveren:
--------------------
iCount = CInt(Request.Form("iCount"))
strSQL_priser = "SELECT * FROM priser"
Set rs_priser = Conn.Execute(strSQL_priser)
strSQL_priser_rediger = ""
while not rs_priser.eof
idnr = rs_priser("id")
strSQL_priser_rediger = strSQL_priser_rediger & " Update priser set "
strSQL_priser_rediger = strSQL_priser_rediger & "navn = '"
& Trim(Replace(Request.Form("navn" & idnr),"'","''" )) & "' , "
strSQL_priser_rediger = strSQL_priser_rediger & "pris = '"
& Trim(Replace(Request.Form("pris" & idnr),"'","''" )) & "' , "
strSQL_priser_rediger = strSQL_priser_rediger & "betaling =
'" & Trim(Replace(Request.Form("betaling" & idnr),"'","''" )) &
"' "
strSQL_priser_rediger = strSQL_priser_rediger & "Where id =
" & idnr
rs_priser.MoveNext
wend
' ** opdater databasen, hvis der er noget at opdatere
if strSQL_priser_rediger <> "" then
Conn.Execute(strSQL_priser_rediger)
end if
------------------------
Håber det løser problemet...
t
| |
Dennis Møller (17-04-2005)
| Kommentar Fra : Dennis Møller |
Dato : 17-04-05 17:36 |
|
Tomasz Otap wrote in dk.edb.internet.webdesign.serverside.asp:
> Så vidt jeg kan se, udføres din MoveNext fint nok. MEN - din kald til
> databasen er indeholdt i selve løkken!
Selvfølgelig! At jeg ikke selv har set det... utroligt.
Nå, men jeg kan ikke helt hitte hoved og hale i de forslag du kommer med.
Jeg har prøvet at copy/paste det, og det virker i hvert fald ikke. Så indtil
videre har jeg bare flyttet "kaldet" udenfor løkken, og det virker jo fint.
Men jeg kan godt se din pointe med, at den opdaterer databasen for hver
eneste post - også selvom der intet er at opdatere. Måske du bedre kan
forklare mig, hvordan jeg undgår det, hvis du ser selve siden?
http://www.xn--rddingantenne-bnb.dk/v1/
Du skal først logge ind som administrator, ved at klikke helt ude til højre
i bundbaren, hvor der kommer en pil ved mouseover. Password er "test".
Derefter kan du gå ind på siden "Priser" og ændre i indholdet ala et
CMS-system. Man kan oprette rækker og slette dem osv.
På forhånd tak!
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Tomasz Otap (17-04-2005)
| Kommentar Fra : Tomasz Otap |
Dato : 17-04-05 18:24 |
|
Dennis Møller wrote:
> Selvfølgelig! At jeg ikke selv har set det... utroligt.
Jep, nogen gange er løsningen åbenlys, man skal bare kigge på det med
friske øjne. :)
> Nå, men jeg kan ikke helt hitte hoved og hale i de forslag du kommer med.
> Jeg har prøvet at copy/paste det, og det virker i hvert fald ikke.
Strange.. i bund og grund gør mit forslag det samme som dit; den samler
blot alle opdateringsforespørgsler i en fælles strSQL_priser_rediger,
der udføres efter løkken afsluttes. Du kan evt. udskrive din
strSQL_priser_rediger inden du executer den, for at se om alle de rette
poster kommer med?
Jeg prøver lige at rydde lidt op i koden; de lange sql-sætningslinier
gør det meget svært at læse og overskue. Jeg har forsøgt at opstille en
funktion til at udføre din gentagne Trim(Replace(Request.Form("xxxx" &
idnr))) for at gøre det lidt mere overskueligt. Du kan også evt. bruge
en underscore _ til at fortsætte din kode videre på næste linie for at
gøre det lidt mere læsevenligt. F.eks.:
myStr = "Denne string " &_
"fortsætter her som om der ingen linieskift var."
I bund og grund kan du sagtens nøjes med din egen løsning, da din
administratormodul ikke opdaterer de store datamængder - og det er næppe
en handling, der foretages ofte og af mange personer samtidig. Men det
er rart at kunne lave til andre, større opgaver.
-- annoteret justeret kode -------------
' ** funktionen til at sql-formattere en string fra request.form
' ** (' erstattes med '' og string sættes i '' efterfølgende)
function sqlformat(myStr)
sqlformat = "'" &_
Trim(Replace(Request.Form(myStr),"'","''")) &_
"'"
end function
iCount = CInt(Request.Form("iCount"))
' ** priser hentes fra databasen i recordset rs_priser
strSQL_priser = "SELECT id FROM priser"
Set rs_priser = Conn.Execute(strSQL_priser)
' ** sql-sætning til prisopdatering gøres klar
strSQL_priser_rediger = ""
' ** løkken startes her
while not rs_priser.eof
'** idnr hentes fra recordset
idnr = rs_priser("id")
' ** Sql-sætning til prisopdatering bygges op.
' ** Hver iteration bygger videre på den eksisterende sætning
' ** Sqlformat() sørger for at erstatte interne anførelsestegn
' ** og opstille anførelsestegn omrking værdien
' ** Vbnewline i enden giver linieskift, der letter fremvisning
' ** hvis man ønsker at få fremvist sql-sætningen
strSQL_priser_rediger = strSQL_priser_rediger &_
" Update priser set " &_
"navn = " & sqlformat("navn" & idnr) & ", " &_
"pris = " & sqlformat("pris" & idnr) & ", " &_
"betaling = " & sqlformat("betaling" & idnr) &_
"Where id = " & idnr & vbnewline
rs_priser.MoveNext
wend
' ** Fremvis sql-sætningen for at checke indholdet
' ** Hver linie burde indeholde sql til opdatering af
' ** 1 row i databasen.
response.write("<pre>" & strSQL_priser_rediger & "</pre>")
' ** Opdater databasen, sql-sætningen ikke er tom
if strSQL_priser_rediger <> "" then
Conn.Execute(strSQL_priser_rediger)
end if
-- annoteret justeret kode slut ---------
Hvad bruger du egentlig iCount-variablen til? Så vidt jeg kan se, bruger
du den ikke til noget under din opdatering?
t
| |
Dennis Møller (17-04-2005)
| Kommentar Fra : Dennis Møller |
Dato : 17-04-05 18:51 |
|
Tomasz Otap wrote in dk.edb.internet.webdesign.serverside.asp:
> Strange.. i bund og grund gør mit forslag det samme som dit; den samler
> blot alle opdateringsforespørgsler i en fælles strSQL_priser_rediger,
> der udføres efter løkken afsluttes.
Jeg har igen prøvet at copy/paste din kode ind, og følgende fejl kommer igen:
Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl, fordi der
mangler en operator. i forespørgselsudtrykket "id = 1 Update priser set navn =
'Drift og vedligehold', pris = '410', betaling = 'pr. halvår' Where id = 2
Update priser set navn = 'Programafgift, Lille pakke', pris = '72', betaling =
'pr. halvår' Where id = 3 Update priser set navn = 'Programafgift,".
/Rødding Antenne/wwwroot/db.asp, line 155
Linje 155 er udførslen, altså:
Conn.Execute(strSQL_priser_rediger)
Men ingen panik, jeg bruger bare min simple løsning, hvor jeg har trukket
"databasekaldet" udenfor løkken.
Men hvis du finder det en sjov udfordring, skal du være velkommen til at prøve
videre. Jeg skal gerne poste, om dine forslag virker. :P
Ellers klarer jeg mig.
Tomasz Otap wrote in dk.edb.internet.webdesign.serverside.asp:
> Hvad bruger du egentlig iCount-variablen til? Så vidt jeg kan se, bruger
> du den ikke til noget under din opdatering?
Nej, det var under min analyse af problemet at jeg brugte den, hvor den jo
kunne begrænse antallet af gange løkken gentog sig. Det var faktisk meningen,
at jeg ville have skrevet i mit oprindelige indlæg, at jeg jo kunne smide al
kode om iCount-variablen helt væk, hvis min MoveNext blot virkede.
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Tomasz Otap (17-04-2005)
| Kommentar Fra : Tomasz Otap |
Dato : 17-04-05 19:51 |
|
Dennis Møller wrote:
> [Microsoft][ODBC Microsoft Access-driver]
Ah, Access. My bad - jeg bruger meget sjældent Access. Jeg tror, fejlen
skyldes, at de enkelte UPDATE sætninger skal separeres med en semikolon.
Så sql-linien med WHERE klausulen kommer til at se sådan her ud:
---------------
"Where id = " & idnr & "; "
---------------
t
| |
Dennis Møller (17-04-2005)
| Kommentar Fra : Dennis Møller |
Dato : 17-04-05 20:56 |
|
Tomasz Otap wrote in dk.edb.internet.webdesign.serverside.asp:
> Ah, Access. My bad - jeg bruger meget sjældent Access. Jeg tror, fejlen
> skyldes, at de enkelte UPDATE sætninger skal separeres med en semikolon.
> Så sql-linien med WHERE klausulen kommer til at se sådan her ud:
> ---------------
> "Where id = " & idnr & "; "
> ---------------
Jaja, men så opstår problemet, at der ikke også må være et semikolon efter
den sidste Update-sætning... Det er i hvert fald sådan jeg forstår følgende
fejl-meddelelse:
Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access-driver] Der er fundet tegn efter
slutningen af SQL-sætningen.
/Rødding Antenne/wwwroot/db.asp, line 155
Linje 155 er igen udførslen, altså:
Conn.Execute(strSQL_priser_rediger)
Men skidt pyt, jeg bruger bare den "beskidte" og "forkerte" løsning... :D
Ellers mange tak for hjælpen!
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Tomasz Otap (17-04-2005)
| Kommentar Fra : Tomasz Otap |
Dato : 17-04-05 22:30 |
|
Dennis Møller wrote:
> Jaja, men så opstår problemet, at der ikke også må være et semikolon efter
> den sidste Update-sætning...
Heh... møg-Access... men man kan nemt fjerne de sidste to tegn ("; ")
fra sql'en, såfremt der er noget i den:
if strSQL_priser_rediger <> "" then
strSQL_priser_rediger = left(strSQL_priser_rediger,
len(strSQL_priser_rediger)-2)
Conn.Execute(strSQL_priser_rediger)
end if
Well, det var sjovt. :)
Held og lykke med det!
t
| |
Dennis Møller (17-04-2005)
| Kommentar Fra : Dennis Møller |
Dato : 17-04-05 20:58 |
|
Tomasz Otap wrote in dk.edb.internet.webdesign.serverside.asp:
> Ah, Access. My bad - jeg bruger meget sjældent Access. Jeg tror, fejlen
> skyldes, at de enkelte UPDATE sætninger skal separeres med en semikolon.
> Så sql-linien med WHERE klausulen kommer til at se sådan her ud:
> ---------------
> "Where id = " & idnr & "; "
> ---------------
Jaja, men så opstår problemet med, at der ikke må være et semikolon efter
sidste Update-sætning. Det er i hvert fald sådan jeg forstår følgende
fejl-meddelelse:
Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access-driver] Der er fundet tegn efter
slutningen af SQL-sætningen.
/Rødding Antenne/wwwroot/db.asp, line 155
Linje 155 er igen udførslen, altså:
Conn.Execute(strSQL_priser_rediger)
Men skidt pyt, jeg bruger bare den "beskidte" og "forkerte" løsning... :D
Ellers mange tak for hjælpen!
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Jens Gyldenkærne Cla~ (18-04-2005)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-04-05 09:53 |
|
Tomasz Otap skrev:
> Bemærk dog, at du på den måde foretager en masse databaseopkald for hver
> omgang i din løkke. Det er bedre at samle alle data i en fælles
> opdateringsstreng, inden den sendes afsted til serveren:
Formelt har du helt ret, men så vidt jeg husker understøtter Access
(eller ado-driveren til Access) ikke flere sql-sætninger i et enkelt
kald. Derfor kan man blive nødt til at køre sætningerne enkeltvis.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Tomasz Otap (18-04-2005)
| Kommentar Fra : Tomasz Otap |
Dato : 18-04-05 10:03 |
|
Jens Gyldenkærne Clausen wrote:
> Formelt har du helt ret, men så vidt jeg husker understøtter Access
> (eller ado-driveren til Access) ikke flere sql-sætninger i et enkelt
> kald.
Det ville naturligvis forklare, hvorfor den samlede SQL ikke ville
køre... Cheers, champ.
t
| |
|
|