Avatar billede bumle90 Nybegynder
28. januar 2004 - 20:49 Der 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....
Avatar billede eagleeye Praktikant
28. januar 2004 - 20:53 #1
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
Avatar billede bumle90 Nybegynder
28. januar 2004 - 21:27 #2
function sqlerr()
Response.Redirect("adrlist.asp?error=1")
end function

if Request.QueryString("error") = "1" then
    Response.Write("Request.QueryString(error)&<br><br>")
Avatar billede bumle90 Nybegynder
28. januar 2004 - 21:27 #3
function sqlerr()
Response.Redirect("adrlist.asp?error=1")
end function

if Request.QueryString("error") = "1" then
    Response.Write("Request.QueryString(error)&<br><br>")
Avatar billede bumle90 Nybegynder
28. januar 2004 - 21:28 #4
Så når jeg udkommenterer de 2 nederste linier der virker det...Og har jeg dem med står siden bare og stener totalt....Fatter intet
Avatar billede bumle90 Nybegynder
28. januar 2004 - 21:29 #5
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
Avatar billede eagleeye Praktikant
28. januar 2004 - 21:31 #6
Den som udskriver skal være:

Response.Write (Fejl kode : " & Request.QueryString("error") & "<br><br>")
Avatar billede bumle90 Nybegynder
28. januar 2004 - 21:34 #7
Ja...Men det gir samme problem...Den står bare og stener.....
Avatar billede bumle90 Nybegynder
28. januar 2004 - 21:37 #8
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....
Avatar billede eagleeye Praktikant
28. januar 2004 - 21:39 #9
hmm det lyder meget underligt.  Der er ikke noget galt eller med den if sætning...
Du har en end if et sted?
Avatar billede bumle90 Nybegynder
28. januar 2004 - 21:43 #10
ja...lige efter faktisk...poster lige hele koden


<%@ Language=VBScript %>
<!--#include file="includes/connection.asp"-->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

<script language=javascript>
    function writeHiddens()
    {
        var index,val;

        index=document.adrList.DriftstedName.selectedIndex;
        val=document.adrList.DriftstedName.options[index].text;
        indhold=findStr(val);
        document.adrList.Driftsted.value=indhold;
       
        index=document.adrList.DivisionName.selectedIndex;
        val=document.adrList.DivisionName.options[index].text;
        indhold=findStr(val);
        document.adrList.Division.value=indhold;

        index=document.adrList.DepartmentName.selectedIndex;
        val=document.adrList.DepartmentName.options[index].text;
        indhold=findStr(val);
        document.adrList.Department.value=indhold;

    }
    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.-->

<FORM name=adrList action="adrlist.asp" method=get onSubmit="writeHiddens();">
<table>
<tr><td>
    Country Code:<select name=Country_code>
        <option>all
        <%
       
        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>
<tr><td>
    Driftsted:<select name=DriftstedName>
            <option>all
            </select>
            <input type=hidden value="" name=Driftsted>
</tr></td>

<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>

</table>
</form>


</BODY>
</HTML>
Avatar billede eagleeye Praktikant
28. januar 2004 - 21:46 #11
Ok, så koden er i samme fil som den redirecter fra. Så tror jeg den går i ring og står og ridrecter til samme side hele tiden...

Du skal havde holdt styr på den kun søger hvis der ikke er en fejl.

Eller prøve at stoppe koden med Response.End når du har udskrevet fejlkoden:

if Request.QueryString("fejl") = "1" then
    Response.Write(Request.QueryString("fejl")&"<br><br>")
    Response.End
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:12 #12
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?
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:13 #13
Så burde den da stadig køre i ring gjorde den ikke?
Avatar billede eagleeye Praktikant
28. januar 2004 - 23:18 #14
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.
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:24 #15
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....
Avatar billede eagleeye Praktikant
28. januar 2004 - 23:28 #16
Men der er jo en form med nogle drop-down bokse som bliver udfyldt, og en af dem kan den ikke finde nogle "options" til og det bliver den ved.
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:32 #17
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...
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:35 #18
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>
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:36 #19
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....

Er der etellerandet jeg har overset?
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:36 #20
Ved godt det er mange spg. jeg her kommer med...Du skal nok få flere pts. bagefter :)
Avatar billede eagleeye Praktikant
28. januar 2004 - 23:37 #21
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.

Alternativt skal du lave det sådan alle data ligger på selve siden sådan man med et javascritp kan ændre drop-down boksen til det valgte. Så skal man ikke reloade formen hele tiden. Se eks:
http://roenving.users.whitehat.dk/index.html?/WD4Selects-beta.html
Avatar billede eagleeye Praktikant
28. januar 2004 - 23:39 #22
Department er det en variable eller en tekst streng. Hvis det en tekst streng skal der " omrkgin:

<option <%if Result.fields(1) = "Department" then %> SELECTED <%end if%>><%=Result.fields(0)%>(<%=Result.fields(1)%>)<%="**"&Result.fields(1)&"  "&Department&"**"%></option>
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:45 #23
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...
Avatar billede eagleeye Praktikant
28. januar 2004 - 23:51 #24
Ok, skal det så være kolonne Result.fields(0) og ikke Result.fields(1)?
Avatar billede bumle90 Nybegynder
28. januar 2004 - 23:54 #25
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?
Avatar billede eagleeye Praktikant
28. januar 2004 - 23:58 #26
Jo det kan godt være derfor :)
Den tror sikekr den ene er et tal og den anden er streng.
Så prøv:

<option <%if Cstr(Result.fields(1)) = Cstr(Department) then %>
Avatar billede bumle90 Nybegynder
29. januar 2004 - 00:05 #27
Det må jeg prøve i morgen.....Jeg vil sige tusind tak for alle de gode råd....Jeg håber det er oki jeg venter med at lukke til i morgen..
Sov godt :)
Avatar billede eagleeye Praktikant
29. januar 2004 - 00:08 #28
Ja det er helt i orden. Jeg er også på vej i seng. Så godnat og sov godt ;)
Avatar billede bumle90 Nybegynder
29. januar 2004 - 10:15 #29
Hey eagleeye...er du der stadig?
Avatar billede eagleeye Praktikant
29. januar 2004 - 17:43 #30
Nu er jeg.
Avatar billede bumle90 Nybegynder
29. januar 2004 - 23:04 #31
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
Avatar billede eagleeye Praktikant
29. januar 2004 - 23:07 #32
Jamen ok så laver jeg lige et svar ;)
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