/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
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

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste