25. november 2005 - 12:31Der er
18 kommentarer og 1 løsning
Do loop until statement = true
Har følgende kode, som kommer med fejlen: ADODB.Field error '80020009'
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
onbes.asp, line 0
---
Set Conn = Server.Createobject("ADODB.Connection") Conn.Open strDSN strSQL = "Select * From best" Set RS = Conn.Execute(strSQL) if rs.eof or rs.bof then BesIDTest = False Else Do until RS.EoF or BesIDTest = True If RS("BesID") <> BesID Then BesIDTest = False Else BesIDTest = True End If RS.Movenext Loop End If
Det jeg forsøger er at check om "BesID" allerede er i databasen, hvis ikke skal en ny oprettes og hvis den er der skal den blot vælges (eller gøre intet i dette stykke kode)
Men hvorfor den fejl, hvad er fejlen i min Do Loop? Det virker til at den ikke kan finde RS("BesID") i tabellen.
Set Conn = Server.Createobject("ADODB.Connection") Conn.Open strDSN strSQL = "Select * From best" Set RS = Conn.Execute(strSQL) Do until RS.EoF or BesIDTest = True If RS("BesID") <> BesID Then BesIDTest = False Else BesIDTest = True End If RS.Movenext Loop
... Og som jind er lidt inde på så kræver if-sætningen at variablerne er af samme datatype og request.Querystring og Form returnere tekst (selvom det er tal). Du skal derfor evt typecaste din BesID eller RS("BesID"):
BesID = cint(request.querystring("BesID")) eller: If RS("BesID")&"" = BesID&"" Then BesIDTest = true
BesID er et unikt ID af navn og session.sessionID som derfor hentes i toppen af siden hvergang den loadeds - så så længe personen har det samme navn samt sessionID skal personen have de oplysninger at vide som han/hun har tilføjet (til BesID som ligger i database tabeleb "best").
For at den så skal kunne huske om der er tilføjet ting eller ej, forsøger jeg at teste om BesID allerede er oprettet i tabellen, hvis den er skal den intet gøre ud over senere at udskrive hvad der allerede står i tabellen. Hvis BesID ikke findes i tabellen, opretter jeg den senere.
Men lige nu sidder jeg fast i hvordan jeg kan teste om BesID er = rs("BesID") Da den åbenbart ikke vil godtage "Do until" .. hvis jeg response.writer output af rs("BesID") er indholdet korrekt.
Har forsøgt med ovenstående, men giver samme fejl.
Jeg har tilføjet "On error resume next" da "set rs = ..." Stadig kom med samme fejl. Det skal den vel også gøre hvis den ikke kan finde BesID i tabellen. Men dette kan ikke være den korrekte måde at gøre det på?
set rs = conn.execute("select * from bestilling where BesID='"& BesID &"'") On error resume next if rs.eof or rs.bof then BesIDtest = False else BesIDtest = True end if
Der skal IKKE være en "On error resume next", og du skal heller ikke tjekke for rs.bof. I alt min tid som programør har jeg kun skulle tjekke for rs.bof 1 gang. Den skal kun bruges når du gennemløber et recordset baglæns. Og "On error.." skal kun bruges til fejlhåndtering, hvis man f.eks vil give brugeren sin egne fejlbeskeder.
Min kode fra "25/11-2005 13:23:32" kan på ingen måde fremkalde en "Either BOF or EOF is True..." fejl. Den eneste fejl der kan være der er at BesID i databasen ikke er et tekst felt og ASP variablen BesID indeholder ' tegnet, men de vil begge give en SQL fejl.
Problemet med "Either BOF or EOF is True..." fejlen er at den ikke giver os et linje nummer, men jeg tror nu at fejlen opstår et senere sted i koden. Kan du smide hele din kode herind??
Fennec, jeg vil gerne give dig points for det her.
Yes, BoF er ikke nødvendig. Ved ikke lige hvorfor den var med her, men enig.
Fejlen opstår kun første gang man kommer ind på siden, da tabellen ikke indholder BesID indformation for den session. Dvs. Conn.execute kan ikke finde BesID = BesID og vil jo fejle, enig? (dette gøres fordi senere bliver BesID sat ind i tabellen, og hvis samme session kommer ind på siden igen, kan den finde tilbage til de indtastede dataer) Så derfor bruger jeg pt. On error resume next, så den blot går videre i koden og laver BesIDtest = False ... alt fungere som det skal nu, men syndes også at bruge On error resume next, virker forkert for at komme forbi fejlen.
Fejlen opstår i set rs = Conn.Execute("select * from bestilling where BesID='"& BesID &"'")
Jeg er lidt en noob til dette, og forsøger derfor blot at finde flere løsninger så det er nemmer at forstå.
Hvilken fejl får du på: set rs = Conn.Execute("select * from bestilling where BesID='"& BesID &"'")
Med denne kode er den 100% fejl fri: set rs = Conn.Execute("select * from bestilling where BesID='"& replace(BesID&"","'","''") &"'") if rs.eof then BesIDtest = False else BesIDtest = True end if
Kræver selvfølgelig stadig at der er et Conn objekt, med forbindelse til databasen, samt at der er en bestilling.BesID kolonne for at jeg kan sige at den er 100% fejlfri :o)
Hvis du stadig får en fejl, forekomme den et andet sted i koden. Jeg vil gætte på har noget gammel kode, hvor du skulle tjekke på BesIDtest i stedet, eller et loop du ikke har tjekket om "rs.eof" inden du kommer ind i.
Du kan evt bruge "On error..." til at finde hvilken linje fejlen er i, ved at tjekke err objektet, som opsamler fejlene.
On error resume next EN LINJE KODE if err.number <> 0 then response.write "Her er en fejl!!"
flyt den if-sætning en linje ned af gangen indtil den finden en fejl. Så ved du der er problemer i linjen lige før.
...Den replacer ikke , (komma) men ' (apostrof). I tilfældet hvor ' indgår i en tekst i en SQL-streng, sker den nemlig en fejl, hvis ' ikke bliver udskiftet med '' (to ').
jb777 >> Jeg forventede skam heller ikke at der var tegn i, men man kan aldrig være sikker. Det er nemlig sådan en fejl som kan drille :o)
Men prøv det med err.number når du får tid...
terry >> Jeg ville heller ikke have læst dem hvis det var mig. Jeg troede desuden også først at det var et nummer felt :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.