Avatar billede jb777 Nybegynder
25. november 2005 - 12:31 Der 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.
Avatar billede terry Ekspert
25. november 2005 - 12:41 #1
not sure I understand why this is necessary

if rs.eof or rs.bof then
BesIDTest = False

Try this

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
Avatar billede terry Ekspert
25. november 2005 - 12:42 #2
or maybe just remove test on BOF.
Avatar billede jind Nybegynder
25. november 2005 - 12:44 #3
If RS("BesID") <> BesID Then

Hvor hentes BesID fra?
Jind
Avatar billede fennec Nybegynder
25. november 2005 - 12:49 #4
Dette burde også klare det:

BesIDTest = False
Set RS = Conn.Execute(strSQL)
while (not rs.eof) and (not BesIDTest)
  If RS("BesID") = BesID Then BesIDTest = true
wend
Avatar billede fennec Nybegynder
25. november 2005 - 12:50 #5
Mangler lige en meget vigtig RS.Movenext :o)

BesIDTest = False
Set RS = Conn.Execute(strSQL)
while (not rs.eof) and (not BesIDTest)
  If RS("BesID") = BesID Then BesIDTest = true
  RS.Movenext
wend
Avatar billede fennec Nybegynder
25. november 2005 - 12:55 #6
... 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
Avatar billede jb777 Nybegynder
25. november 2005 - 13:13 #7
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.
Avatar billede fennec Nybegynder
25. november 2005 - 13:23 #8
Hvad med denne metode:

set rs = conn.execute("select * from best where BesID='"& BesID &"'")
if rs.eof then
  'Er ikke i databasen
else
  'Er i databasen
end if
Avatar billede jb777 Nybegynder
25. november 2005 - 13:44 #9
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
Avatar billede fennec Nybegynder
28. november 2005 - 09:08 #10
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??
Avatar billede jb777 Nybegynder
28. november 2005 - 12:02 #11
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å.
Avatar billede fennec Nybegynder
28. november 2005 - 12:47 #12
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.
Avatar billede jb777 Nybegynder
28. november 2005 - 14:09 #13
Fejlen sker ved linien:
set rs = Conn.Execute("select * from bestilling where BesID='"& BesID &"'")

Dit andet eksempel med replace giver samme fejl, desuden er der ikke "," i sætningen

bestilling.BesID findes i databasen. Desuden kan jeg også update og hente fra den tabel i øjeblikket (med On Error resume next)

Conn objekt er også defineret

I øjeblikket må fejlen så ligge et andet sted, men jeg vil check op på det senere ved rettelse og kommentering af koden.

Mange tak for den konstruktive dialog :)
Avatar billede terry Ekspert
28. november 2005 - 14:14 #14
set rs = Conn.Execute("select * from bestilling where BesID = "& BesID )
Avatar billede fennec Nybegynder
28. november 2005 - 14:18 #15
...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 ').

Du siger bare til hvis du skal have mere hjælp.

.o) <-- One Eyed Jack
Avatar billede fennec Nybegynder
28. november 2005 - 14:20 #16
Terry >>
ifølge "25/11-2005 13:13:53" består BesID af navn + sessionID så det må være en tekst :o)
Avatar billede jb777 Nybegynder
28. november 2005 - 14:22 #17
Ja har du ret i, jeg læste forkert med hensyn til , og '

Ja BesID består kun af navn + sessionID. så der indgår ingen tegn i den. Kun tekst.
Avatar billede terry Ekspert
28. november 2005 - 14:26 #18
fennec>I havent bothered to read all comments, so I was just assuming that a field/variable with ID in it was a number.
Avatar billede fennec Nybegynder
28. november 2005 - 14:30 #19
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)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester