Avatar billede jan2001 Nybegynder
31. januar 2008 - 22:40 Der er 15 kommentarer og
1 løsning

når rækken ikke eksisterer

Jeg bruger en sql sætning der bruger en where id=. Det er dog ikke altid id'en findes i databasen. Dette giver en fejl. Hvordan kan jeg tjekke om det eksisterer inden jeg udfører forespørgslen.
Avatar billede nielle Nybegynder
31. januar 2008 - 22:47 #1
Sådan?

sql = "SELECT count(*) AS antal FROM dinTabel WHERE id=42"
Set rs = Conn.Exetecute(sql)

If rs("antal") = 0 Then
    ' Eksistere ikke
Else
    ' Eksistere
End If
Avatar billede softspot Forsker
31. januar 2008 - 22:48 #2
Du kan vel også kontrollere om rs.eof inden du begynder at læse fra dit resultat.

Altså:

set rs = conn.execute(dinsql)
if not rs.eof then
  ' læs bare løs!
else
  ' der er ikke noget i resultatet
end if
rs.close
Avatar billede erikjacobsen Ekspert
31. januar 2008 - 22:49 #3
Sku' der være nogen grund til at spørge om den findes før du spørger. Du kan bare (skitse):


sql = "SELECT * FROM dinTabel WHERE id=42"
Set rs = Conn.Exetecute(sql)

if rs.eof then
  'Ingen bananer, spis appelsiner
else
  'Ja, den var der. Skriv felterne ud
end if
Avatar billede goose Nybegynder
31. januar 2008 - 22:49 #4
Måske sådan:

SQL = "select * from TABEL where id=" & request.querystring("id")
set rs = conn.execute(SQL)
if rs.eof then

' id findes ikke send f.eks. til fejlside

else

' gør det der skal gøres

end if

/Goose
Avatar billede jan2001 Nybegynder
01. februar 2008 - 09:32 #5
Jeg kan ikke spørge på rs.eof førjeg har eksekveret sql sætningen, og det er ved denne eksekvering, at der kommer en fejl, hvis ID ikke findes i databasen.
Måske nielles forslag kan bruges????
Avatar billede softspot Forsker
01. februar 2008 - 09:42 #6
Ved du ikke hvilke felter der er i dine tabeller?
Avatar billede jan2001 Nybegynder
01. februar 2008 - 10:12 #7
Jeg sender en Id til databasen. Hvis den er i databasen, udskrives indholdes, hvis ikke, så vises bare en form til at oprette ny række med denne ID.
Avatar billede softspot Forsker
01. februar 2008 - 11:18 #8
OK, så er et check på rs.eof den helt rigtige måde at gøre det på.

Hvis du får en fejl i det du udfører din SQL-sætning, så er det højst sandsynligt fordi der er syntaksfejl i sætningen.

Hvor sikker er du på at det er manglende data der er årsagen? Kan det f.eks. være at det id du forsøger at finde, rent faktisk ikke er et tal (en typisk fejl, er at man forsøger at sammensætte en SQL-streng med en tom værdi fra f.eks. Request.QueryString)...?
Avatar billede jan2001 Nybegynder
01. februar 2008 - 14:42 #9
Nej det giver ingen forskel på om det er et tal eller ej.
Det med at lave en count i sql virker. Men synes bare ikke det virker smart at tilgå databasen to gange. altså

sql = "SELECT count(*) AS antal FROM dinTabel WHERE id=42"
Set rs = Conn.Execute(sql)

If not rs("antal") = 0 Then
    sql = "SELECT * FROM dinTabel WHERE id=42"
Set rs = Conn.Exetecute(sql)

End If
Avatar billede softspot Forsker
01. februar 2008 - 14:56 #10
Det du siger giver ikke mening ifht. normal funktion, for hvis du kan lave en count på tabellen og få et resultat tilbage, kan du også lave et opslag og checke på om rs.eof er sand. Derfor må din forespørgsel have en fejl, som bevirker at koden fejler på execute.

Hvad er det helt præcis for en fejl du oplever og hvad er det helt præcis for en SQL du forsøger at køre i det tilfælde koden fejler?
Avatar billede jan2001 Nybegynder
01. februar 2008 - 17:54 #11
Either BOF or EOF is True, or the current record has been deleted; the operation requested by the application requires a current record.

tabel_rec = "select * from tabel where day(Dato)='" & ID & "';"
set rs = objConn.execute(tabel_rec)
Avatar billede softspot Forsker
01. februar 2008 - 18:10 #12
OK, men det sker vil først når du prøver at læse fra rs?? Og det er jo netop det du undgår at komme til ved at teste på rs.eof inden du læser noget som helst fra rs.

Er det mon fordi du ikke har set lyset ifht. hvordan det skal bruges, siden du har insisteret på, at du ikke kan bruge den foreslåede løsning...?

Dette skulle illustrere metoden:

tabel_rec = "select * from tabel where day(Dato)='" & ID & "';"
set rs = objConn.execute(tabel_rec)

if not rs.eof then
  do while not rs.eof
    response.write "felt 1: " & rs(0) & "<br>"
    response.write "felt 2: " & rs(1) & "<br>"
    ' osv. osv. - du ved nok hvordan man henter de rigtige værdier ud af et recordset...
    rs.movenext
  loop
else
  response.write "Der findes ikke nogen data for den angivne dag"
end if

rs.close
set rs = nothing
Avatar billede jan2001 Nybegynder
02. februar 2008 - 17:31 #13
ok, nu virker det med rs.eof. Jeg har prøvet mange ting, så kan næsten ikke huske hvad der virkede og ikke virkede. Men mener fejlen forsvandt i forbindelse med, at jeg satte '' omkring ID nummeret.
Så pointene må gå til dig softspot.
Avatar billede softspot Forsker
02. februar 2008 - 18:09 #14
Velbekomme :)

NB: Selvom der fungerer med apostrofferne omkring id'et, så vil jeg mene det er en symptombehandling på et andet problem. ID bør vel altid indeholde en gyldig talværdi, eller hvad?

Hvorom alt er, så bør du altid sikre dig, at dine variable indeholder værdier der har det rigtige format og den rigtige type, inden du sammensætter SQL-strenge, hvor variablen indgår. Jeg ved det er et stort arbejde, men alternativet er ustabile applikationer, der i værste fald sætter dine data's sikkerhed over styr og endnu værre, at personlige oplysninger om andre bliver tilgængelige for folk, som ikke burde have adgang til dem.
Avatar billede jan2001 Nybegynder
02. februar 2008 - 20:21 #15
ok. mange tak.
Avatar billede softspot Forsker
02. februar 2008 - 20:34 #16
Tak for point :)
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
Kurser inden for grundlæggende programmering

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