Avatar billede satanic_raven Nybegynder
12. april 2004 - 19:13 Der er 21 kommentarer og
3 løsninger

Fejl i ASP kode, men hvor?

Sidder i forbindelse med et it projekt og laver et e-handelssystem i ASP, og har fået en underlig fejl, som jeg ikke selv kan se i mit script...

Fejlen er:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x3a8 Thread 0x720 DBC 0x4b785ec Jet'.

/it_projekt/produktet/Profile.asp, line 75


Og her kommer scriptet så lige:
<!-- Minus AutoDato -->
<%@ Language=VBScript %>
<% Response.Buffer = True %>
<% mode = request("mode") %>
<% if mode = "" then %>
<%
If Not Session("login") > 0 Then Response.Redirect("Profile.asp?mode=Error")
%>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("database/database.mdb")
strSQL = "SELECT * FROM Brugere WHERE Kunde_nr='"& login &"'"
set rs = Conn.execute(strSQL)

if rs.EOF then
Response.Write "Der er opstået problemer med Deres login."
else
Do Until rs.EOF
%>
<p>Velkommen <%=RS("Navn")%>.</p>
<p>De er nu logget ind på systemet, og kan frit foretage ændringer i Deres
profil eller ordrer.</p>
<%
RS.MoveNext
Loop
end if
Conn.Close
Set Conn = Nothing
%>

<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("database/database.mdb")
strSQL = "SELECT * FROM Mailbox WHERE Ny ='Ja' AND Kunde_nr='"& login &"'"
set rs = Conn.execute(strSQL)

if rs.EOF then
Response.Write ""
else
Response.Write "<p>De har én eller flere ulæste nyheder i Deres <a href=""Mailbox.asp"" target=""Main"">mailbox</a>.</p>"
%>
<%
RS.MoveNext
end if
Conn.Close
Set Conn = Nothing
end if
%>

<% if mode = "Error" then %>
<form method="POST" action="Profile.asp?mode=Login">
  <table border="0" width="250">
    <tr>
      <td>Brugernavn:</td>
      <td><input type="text" name="Username" size="20"></td>
    </tr>
    <tr>
      <td>Password:</td>
      <td><input type="password" name="Password" size="20"></td>
    </tr>
    <tr>
      <td colspan="2"><input type="Submit" value="Log ind" name="Login">&nbsp;&nbsp; <input type="reset" value="Nulstil" name="Reset"></td>
    </tr>
  </table>
</form>
<% end if %>

<% if mode = "Login" then %>
<%
Session("Brugernavn") = request.form("Brugernavn")
Session("Password") = request.form("Password")
%>
<%
set Conn = Server.createobject("adodb.connection")
conn.Open "DBQ="& Server.MapPath("database/database.mdb") &"/database.mdb; DefaultDir=DBQ="& Server.MapPath("database/database.mdb") &";Driver={Microsoft Access Driver (*.mdb)};"

Response.Buffer = True

Function checklogin(Brugernavn,Password)
    set tjek = Conn.Execute("SELECT * FROM Brugere WHERE Brugernavn = '"& Brugernavn &"' AND Password = '"& Password &"'")
    If tjek.EOF THEN
        Response.Write "<center><FONT FACE=Verdana SIZE=4 COLOR=#FF0000><B>Forkert brugernavn eller password.<br><br> Tjek at de indtastede oplysninger er korrekte og prøv igen.<br>Hvis De ikke er en registreret bruger, kan De oprette Dem <a href=""Profile.asp?mode=New"" target=""Main"">her</a></B></FONT></center>"
    Else
        Session("login") = tjek("Kunde_Nr")
        Response.Redirect("Profile.asp?mode=")
    End If
End Function

Function sqlreplace(streng)
    sqlreplace = Replace(streng,"'","''")
End Function
REM Diverse funktioner slut
%>

<% end if %>

Håber der er nogle friske hoveder derude som kan hjælpe...

S.R.
Avatar billede hepou Nybegynder
12. april 2004 - 19:33 #1
prøv lige at udskifte linie 74 og 75 med

    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " & Server.MapPath("database/database.mdb")

:)
Avatar billede keysersoze Guru
12. april 2004 - 19:33 #2
Din database-connection i linie 75 ser lidt underlig ud;

conn.Open "DBQ="& Server.MapPath("database/database.mdb") &"/database.mdb; DefaultDir=DBQ="& Server.MapPath("database/database.mdb") &";Driver={Microsoft Access Driver (*.mdb)};"

Mon ikke den bare skal være

Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("database/database.mdb")
Avatar billede hepou Nybegynder
12. april 2004 - 19:35 #3
eller bare slette

&"/database.mdb

i linie 75
Avatar billede keysersoze Guru
12. april 2004 - 19:35 #4
Derudover er der absolut ingen grund til at lave 3 database-connections - lav én og benyt den hele vejen ned gennem siden da du så får et betydeligt lettere script.
Avatar billede satanic_raven Nybegynder
12. april 2004 - 20:23 #5
keysersoze -> Det er ved at være lang tid siden at jeg sidst rodede med ASP, så jeg kunne godt bruge en lille refresh af min hukommelse...

Hvordan er det lige at jeg lave flere "kald" til én database på én gang??? Har prøvet på at få det til at virke, men det gik lidt i kage... Derfor valgte jeg den med 3 selvstændige...

Kan du gi' et hint???

S.R.
Avatar billede keysersoze Guru
12. april 2004 - 21:33 #6
Du laver bare ét kald oppe i toppen

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("database/database.mdb")

Og så lader du være med at lukke forbindelsen før nederst på siden

Conn.Close
Set Conn = Nothing
Avatar billede satanic_raven Nybegynder
12. april 2004 - 22:16 #7
Tænkte nu mest på hvordan jeg henter fra flere tabeller fra den samme DB på én gang...

Men det skal vel være noget lign. det her?

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("database/database.mdb")
SQL1 = "SELECT * FROM Brugere..."
SQL2 = "SELECT * FROM Mailbox..."

og så bruge:

RS1 = Conn.Execute("SQL1")
RS2 = Conn.Execute("SQL2")

Og så lukke dem alle til sidst???

Conn.Close
Set Conn = Nothing

Er det ca. sådan det fungerer??? Havde problemer med at få det til at virke dengang, og har det stadig... Så kan virkelig godt bruge lidt hjælp...

S.R.
Avatar billede keysersoze Guru
12. april 2004 - 23:01 #8
det er korrekt at det skal være sådan - ja.
Avatar billede hepou Nybegynder
12. april 2004 - 23:07 #9
Du kan vist også gøre det med noget der ligner

SQL = "SELECT * FROM brugere AS b, Mailbox AS m WHERE b.brugernavn = '"& Brugernavn &"' AND b.Password = '"& Password &"'AND m.ny ="
Avatar billede hepou Nybegynder
12. april 2004 - 23:24 #10
en anden ting er at når du laver dit db-kald er det nemmest at have det i en fil du ex. kalder conn.asp indeholdende

    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " & Server.MapPath("database/database.mdb")

herefter kalder du bare

  <--! #include file="conn.asp" -->

i alle de dokumenter der kalder db'en. Hvis du så på et tidspunkt skifte db kan du nøjes med at ændre koden i én fil frem for alle dine filer.

;)
Avatar billede hepou Nybegynder
12. april 2004 - 23:27 #11
Din sql streng skal nok hedde

SQL = "SELECT * FROM brugere AS b, Mailbox AS m WHERE b.brugernavn = '"& Brugernavn &"' AND b.Password = '"& Password &"'OR m.Ny ='Ja' AND m.Kunde_nr='"& login &"';"

;)
Avatar billede satanic_raven Nybegynder
13. april 2004 - 16:34 #12
Nu har jeg fået ændret det der skulle ændres, men der er stadig fejl... Eller, dvs. den viser ikke nogen fejl-meddelse, den smider bare indholdet af "index.asp" (min ramme-side) over i "Profile.asp"... Siden er bare blank istedetfor at indeholde noget...

Ved ikke helt HVAD der går galt, men smider lige scriptet her:

<%@ Language=VBScript %>
<% Response.Buffer = True %>
<% mode = request("mode") %>
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("database/database.mdb")
%>
<% if mode = "Ok" then

If Not Session("login") > 0 Then Response.Redirect("Profile.asp?mode=Error")

response.write Session("login")

SQL1 = "SELECT * FROM Brugere WHERE Kunde_Nr='" & Session("login") & "'"
set RS1 = Conn.Execute(SQL1)

if RS1.EOF then
Response.Write "Der er opstået problemer med Deres login."
else
Do Until RS1.EOF
%>
<p>Velkommen <%=RS1("Navn")%>.</p>
<p>De er nu logget ind på systemet, og kan frit foretage ændringer i Deres
profil eller ordrer.</p>
<%
RS1.MoveNext
Loop
end if
%>

<%
SQL2 = "SELECT * FROM Mailbox WHERE Ny ='Ja' AND Kunde_nr ='"& login &"'"
set RS2 = Conn.execute(SQL2)

if RS2.EOF then
Response.Write ""
else
Do Until RS2.EOF
%>
<p>De har én eller flere ulæste nyheder i Deres <a href="Mailbox.asp" target="Main">mailbox</a>.</p>
%>
<%
RS2.MoveNext
Loop
end if
%>
<%
end if
%>

<% if mode = "Error" then %>
<form method="POST" action="Profile.asp?mode=Signin">
  <table border="0" width="250">
    <tr>
      <td>Brugernavn:</td>
      <td><input type="text" name="Brugernavn" size="20"></td>
    </tr>
    <tr>
      <td>Password:</td>
      <td><input type="password" name="Password" size="20"></td>
    </tr>
    <tr>
      <td colspan="2"><input type="Submit" value="Log ind" name="Login">&nbsp;&nbsp; <input type="reset" value="Nulstil" name="Reset"></td>
    </tr>
  </table>
</form>
<% end if %>

<% if mode = "Signin" then %>
<%
Session("Brugernavn") = request.form("Brugernavn")
Session("Password") = request.form("Password")

Response.Buffer = True

    set tjek = Conn.Execute("SELECT * FROM Brugere WHERE Brugernavn = '"& Session("Brugernavn") &"' AND Password = '"& Session("Password") &"'")
    if tjek.EOF then
        response.write "<center><FONT FACE=""Verdana"" SIZE=""4"" COLOR=""#FF0000""><B>Forkert brugernavn eller password.<br><br> Tjek at de indtastede oplysninger er korrekte og prøv igen.<br>Hvis De ikke er en registreret bruger, kan De oprette Dem <a href=""Profile.asp?mode=New"" target=""Main"">her</a></B></FONT></center>"
    else
        Session("login") = tjek("Kunde_Nr")
        Response.Redirect("Profile.asp?mode=Ok")
    end if

Function sqlreplace(streng)
    sqlreplace = Replace(streng,"''","''")
End Function
REM Diverse funktioner slut
%>

<%
end if

Conn.Close
Set Conn = Nothing
%>

Og hvis en eller anden så ville tjekke at alle mine DB-kald er korrekte, ville det være skønt...

S.R.
Avatar billede keysersoze Guru
13. april 2004 - 16:55 #13
Det er næsten umuligt at tjecke op på så meget kode uden selv at sidde med det - det bliver nødt til at tage lidt af det hårde arbejde selv. Sæt nogle tjeck-punkter op i scriptet og se hvor langt scriptet når og hvor den evt stopper - udskriv en masse variabler undervejs for at se om de er korrekt etc

brug response.end til at stoppe scriptet og på den måde langsomt arbejde dig fremad
Avatar billede satanic_raven Nybegynder
13. april 2004 - 17:08 #14
Hvis du vil, skal du da være mere end velkommen til at kigge hele skidtet igennem, og så test-køre det i en mappe på FTP'en...

Og har prøvet det med at udskrive variabler løbende gennem hele scriptet, men nu viser den jo slet ikke noget af det der står på siden... Ikke engang en fejl-meddelse...

S.R.
Avatar billede thesurfer Nybegynder
13. april 2004 - 17:17 #15
Lige et par ting:
1) Denne linie er overflødig, da VBScript er standard, når det er ASP: <%@ Language=VBScript %>
2) Sæt Response.buffer til False <% Response.Buffer = False %>.. så kan du se fejlen..

Prøv med "Do while not RS1.EOF" i stedet for Do Until RS1.EOF:
Do Until RS1.EOF
%>
<p>Velkommen <%=RS1("Navn")%>.</p>
<p>De er nu logget ind på systemet, og kan frit foretage ændringer i Deres
profil eller ordrer.</p>
<%
RS1.MoveNext
Loop

Det kan være at det er det, der er fejlen.. en loop der sidder fast.. så kan den jo ikke vise siden, pga Response.Buffer = True.
Avatar billede satanic_raven Nybegynder
13. april 2004 - 17:21 #16
thesurfer -> Det prøver jeg, men havde et problem førhen, hvor den skrev noget om en "data-type mismatch in criteri at line 16" eller 17...

16: SQL1 = "SELECT * FROM Brugere WHERE Kunde_Nr='" & Session("login") & "'"
17: set RS1 = Conn.Execute(SQL1)

Og de 2 linier kan jeg ikke se nogen fejl i, og den melder heller ikke fejl nu, selvom jeg ikke har ændret noget i linien/linierne siden da...

S.R.
Avatar billede thesurfer Nybegynder
13. april 2004 - 17:22 #17
Hvis feltet Kunde_Nr er af typen tal, må værdien *ikke* være omkredset af ' tegn:

SQL1 = "SELECT * FROM Brugere WHERE Kunde_Nr = " & Session("login")

Du skal muligvis bruge:

SQL1 = "SELECT * FROM Brugere WHERE Kunde_Nr = " & CInt(Session("login"))
Avatar billede thesurfer Nybegynder
13. april 2004 - 17:23 #18
"data-type mismatch..."-fejlen betyder, at du prøver på at putte en forkert værdi-type, i et felt..
f.eks:

Feltet er af typen "tal": Der må *ikke* være ' tegn om værdien
Feltet er af typen "tekst": Der *skal* være ' tegn om værdien
Avatar billede keysersoze Guru
13. april 2004 - 17:55 #19
jeg har ikke noget imod at hjælpe - men skal jeg sidde og rette større scripts og bruge en masse tid på det uden om E står jeg af... ikke fordi jeg ikke gider men fordi det er sådan nogle ting jeg tager betaling for :)

Og ellers så thesurfers kommentar fra 17:23:57 god at gå ud fra for at undgå mismatch :)
Avatar billede satanic_raven Nybegynder
14. april 2004 - 14:02 #20
Ok... Så fandt jeg ud af det... Det var lidt problemer mht. til 3 linier:

<% if mode = "Ok" then  || Den blev rettet til:
<% if mode = "" then

og

SQL1 = "SELECT * FROM Brugere WHERE Kunde_Nr='" & Session("login") & "'" || Den blev rettet til:
SQL1 = "SELECT * FROM Brugere WHERE Kunde_Nr=" & Session("login") || Som det blev foreslået af "thesurfer"... Tak for dit tips om tal vs tekst... Svarer "CInt()" til "eval()" i JavaScript?

samt

Response.Redirect("Profile.asp?mode=Ok") || Den blev rettet til:
Response.Redirect("Profile.asp)

Hvis "thesurfer" lige opretter et svar, så deler jeg pointene imellem jer, da jeg syntes at alle jeres kommentarer var brugbare... Enten helt, eller delvist...

S.R.
Avatar billede thesurfer Nybegynder
14. april 2004 - 14:56 #21
Nej, CInt er ikke som eval.
CInt forvandler den værdi man foder den med, til en integer..
CInt: http://www.w3schools.com/vbscript/func_cint.asp

Se de andre funktion man kan bruge (kommer an på typen af værdien): http://www.w3schools.com/vbscript/vbscript_ref_functions.asp#conversion

- Svar.
Avatar billede satanic_raven Nybegynder
14. april 2004 - 15:01 #22
Ok... Takker for de udemærkede forslag...

Vender skrækkeligt tilbage i en ny tråd hvis der opstår problemer igen... Gør der jo nok, så hold øjnene åbne... :D

S.R.
Avatar billede thesurfer Nybegynder
14. april 2004 - 15:02 #23
:-)

Takker for points :-)
Avatar billede satanic_raven Nybegynder
14. april 2004 - 15:03 #24
Det var så lidt...

S.R.
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