12. april 2004 - 19:13Der 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 = "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...
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.
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...
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 &"';"
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:
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 = "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...
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
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...
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.
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 :)
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...
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.