28. januar 2004 - 20:49Der er
31 kommentarer og 1 løsning
Behandling af SQL fejl
Hej, jeg vil høre om nogen ved om det er muligt at behandle en databasefejl inden den laver ravage på siden. Altså jeg mener hvis der ikke er nogle records i et recordset, at man så i en pæn alertbox skriver ingen rækker eller sådan noget istedet for en stor fed SQL fejl....
Du kan bruger .EOF til at tjekke med om et recordset er tomt:
SQL = "select * from tabel where kolonne='ikkefindes'" Set rs = Conn.Execute(SQL) if rs.EOF then Response.Write "Ingen poster i databasen" else 'der er poster udskriv dem end if
p.s. Det er med vilje Alt hvad der inde i den response.write står i plinger, så burde den nemlig bare skrive ud ligemeget hvad...men det gør den heller ikke....Så der er noget galt med denne linie if Request.QueryString("error") = "1" then Og jeg kan bare ikke se det
Hvis jeg derimod skriver Response.Redirect("adrlist.asp") istedet for Response.Redirect("adrlist.asp?error=1") så virker det upåklageligt... Det gir absolut ingen mening....
} function findStr(val) { var start=val.indexOf("("); var slut=val.indexOf(")"); var delstreng=val.substring(start+1,slut) return delstreng; } </script>
</HEAD> <BODY>
<%
function sqlerr() Response.Redirect("adrlist.asp?fejl=1") end function
if Request.QueryString("fejl") = "1" then Response.Write(Request.QueryString("fejl")&"<br><br>") ' Country_code=Request.QueryString("Country_code") ' Division=Request.QueryString("Division") ' Department=Request.QueryString("Department") else Country_code=Request.QueryString("Country_code") if Country_code="" or Country_code="all" then Country_code="%" end if Division=Request.QueryString("Division") if Division="" or Division="all" then Division="%" end if Department=Request.QueryString("Department") if Department="" or Department="all" then Department="%" end if end if
%>
<!--There was no rows corresponding to your selections in the database. Please change the input in the selectboxes.-->
sql = "SELECT DISTINCT IndexCards.Landekode"&_ " FROM employees_dk.dbo.IndexCards"&_ " WHERE IndexCards.Division LIKE '"&Division&"'"&_ " AND IndexCards.Afdeling LIKE '"&Department&"'"&_ " ORDER BY IndexCards.Landekode ASC" Set Result=Connection.Execute(sql) if Result.EOF then sqlerr() end if Result.Movefirst
while not Result.EOF %> <option<%if Result.fields(0)=Country_code then %> SELECTED <%end if%>> <%=Result.fields(0)%> <%Result.Movenext wend%> </select>
<tr><td> Division:<select name=DivisionName> <option>all <% sql = "SELECT DISTINCT IndexCards.Divisionsnavn,IndexCards.Division"&_ " FROM employees_dk.dbo.IndexCards"&_ " WHERE IndexCards.Landekode LIKE '"&Country_code&"'"&_ " AND IndexCards.Afdeling LIKE '"&Department&"'"&_ " ORDER BY IndexCards.Division ASC" Set Result=Connection.Execute(sql) if Result.EOF then sqlerr() end if Result.Movefirst while not Result.EOF %><option<%if Result.fields(1)=Division then %> SELECTED <%end if%>><%=Result.fields(0)%>(<%=Result.fields(1)%>) <%Result.Movenext wend%> </select> <input type=hidden value="" name=Division> </tr></td> <tr><td> Department:<select name=DepartmentName> <option>all <% sql = "SELECT DISTINCT IndexCards.Afdelingsnavn,IndexCards.Afdeling"&_ " FROM employees_dk.dbo.IndexCards"&_ " WHERE IndexCards.Landekode LIKE '"&Country_code&"'"&_ " AND IndexCards.Division LIKE '"&Division&"'"&_ " ORDER BY IndexCards.Afdeling ASC"
Set Result=Connection.Execute(sql) if Result.EOF then sqlerr() end if Result.Movefirst while not Result.EOF %> <option <%if Result.fields(1) = Department then %> SELECTED<%end if%>><%=Result.fields(0)%>(<%=Result.fields(1)%>)<%="**"&Result.fields(1)&" "&Department&"**"%></option> <%Result.Movenext wend%> </select> <input type=hidden value="" name=Department> <input name="sub" type="submit" value="Submit"> </tr></td>
Det lyder meget logisk...Det er da garanteret det den gør... Må jeg vente med at lukke spørgsmålet til i morgen? Jeg kan ikke teste det nu nemlig..er taget hjem fra arbejde...Men ja, det er da sikkert det den gør. Bortset fra, hvorfor hjælper det hvis jeg fjerne fejl=1 fra querystrengen?
Jo du har ret umiddelbart ville man også forvendte den kørte i ring selv om der ikke er en QueryString på redirecten.
Det jeg mener er at første gang siden vises og en Result.EOF er true for en af dem kaldes funtion sqlerr():
if Result.EOF then sqlerr() end if
Da det er samme side vil den bare endu en gang søge med den samme SQL sætning og endnu engang ikke kunne finde nogle poster og sqlerr() kaldes igen. Så køre det i ring.
Hvad er planen når der kommer en "fejl"?? Skal siden loades igen eller en fejl side.
Planen er at man skal fremkomme til samme side med en fejlmeddelse om at forspørgslen ikke kunne udføres i databasen. De valg man så har foretaget sig på foregående side skal stadig stå som selected i selectboxxene, så man ikke skal til at trykke det hele ind igen for bare at få en ny fejl..Det er altså sådan mest for at gøre siden mere brugervenlig....
Ja....det har du ret i...Kan godt se problemet... Jeg havde også overvejet at lave det så den opdataerede siden hver gang man ændrede i en dropdown...altså vha. onChange() så man hele tiden havde mulighed for at gå et skridt tilbage hvis noget gik galt...Den skulle så samtidig opdatere boksene løbende, så hvis man valgte noget i en dropdownbox filtrede den alle tupler fra i de 2 andre der ikke havde den værdi...Håber det gir mening det her...Kan du se hvad jeg mener...
Jeg havde det faktisk også lavet...Men der rendte jeg også ind i en meget meget mystisk fejl. En if sætning blev ikke opfyldt selvom den burde blive det. Jeg udskrev data lige før og efter, og kunne se at den burde forgrene i if-sætningen. Den gjorde det bare ikke...Og jeg kunne simpelthen ikke se hvad der var galt. Det var derfor jeg gik over til den her anden lidt dårligere løsning. Den ifsætning hvori det gik galt er faktisk også med foroven, men har dog ingen indflydelse på siden nu, da jeg der ovenover har fjernet alle onChange() ved selectboksene.
Dette var if-sætningen <option <%if Result.fields(1) = Department then %> SELECTED<%end if%>><%=Result.fields(0)%>(<%=Result.fields(1)%>)<%="**"&Result.fields(1)&" "&Department&"**"%></option>
Den nægtede simpelthen at skrive selected. Som du ser udskrev jeg <%="**"&Result.fields(1)&" "&Department&"**"%> lige efter, hvor jeg kunne se de 2 strenge var helt ens....
Ja jeg kan se hvad du mener. Hvis du vil slå det op i databasen hver gang er det nok bedst med onChange at submitte så har du menlig også de data som er udfyldt i formen. Når man laver en redirect går POST og GET data fra formen tabt.
oki...Det er meget sejt det eksempel der...Der er bare en lille forskel, og det er at man skal kunne tilgå enhver af boksene som begyndelse, og alle er på en måde afhængige af hinanden...hvis du ser hvad jeg mener. Fx. hvis man kan huske afdelingsnummeret behøver man ikke klikke sig igennem de 2 første bokse, men kan bare hoppe direkte til den sidste hvorefter de 2 foregående ændrer sig også. Problemet kommer så hvis man huskede forkert...trykker en afdeling ind, og gerne vil vælge et land alligevel. Nu er den dropbox jo så skrimpet ind til det ene land hvori afdelingen ligger....hvad gør man så. Som jeg ser det kunne man lave en reset link der nulstillede tekstboksene igen...
Btw. Department det er en variabel som bliver tilskrevet med Request.Querystring("Department") længere oppe...
Mmm nej...Den har jeg også prøvet. kolonne 1 indeholder nr. 0 indeholder navn. Det er nummeret jeg vil sammenligne på...:Det kan ikke have noget at gøre med at det er et tal der er indeholdt i variablen Department vel?
Ville bare lige sige at jeg brugte option <%if Cstr(Result.fields(1)) = Cstr(Department) then %> og det fik det hele til at spille...på den gode måde :) Så jeg laver ikke behandling af SQL fejl, men istedet en fuld dynamisk side med dropdowns der dynamisk tilpasser sig. PErfekt... Resten fik jeg hurtigt lavet færdig :) Så tak for hjælpen...Hvis du lægger et svar gir jeg dig point
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.