Jag läser en ganska gammal bok om ASP och jag håller på med kapitlet om databaser. Men jag frågar om det finns konstnadsfria allternativ till DSN.
Databaser
DSN ska du radera ut ur ditt ramminne. :)
Används inte längre p.g.a. dålig prestanda och dålig säkerhet samt väldigt krångligt att sätta upp om man inte själv äger servern.
Så här kan du exempelvis connecta utan någon DSN:
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.Open Server.MapPath("databasen.mdb")
%>
Exempel för en access-databas. Står det något om någon fil som heter adovbs.inc så kan du hoppa över det stycket också.
Tack, men nu är det är så att boken använder en äldre version av Acces. Jag använder 2007 och jag vill veta om det finns ett sätt att byta layouten till "klassiskt läge" eller något.
Okej glöm det jag sa innan, boken är gammal jag kan inte följa det.
Jag vill veta koderna man behöver för att få Databasen att funka vilket jag verkar ha stora svårigheter med.
Och förresten, vad är "rs"?
Kan ni inte hjälpa mig att ansluta till en databas med asp? Jag behöver det verkligen...
Nej, det finns inget klassiskt läge i Access 2007.
Rs är en förkortning för objektet Recordset som bland annat innehåller de poster som du har hämtat ut från databasen.
Men vi tar ett välkommenterat exempel istället för att gå in på saken närmare.
<%
'Skapar ett ojekt som heter db som används för att ansluta till databasen.
Set db = Server.CreateObject("ADODB.Connection")
'Talar om för databasen att det är en Accesdatabas
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'Öppnar databasen test.mdb
db.Open Server.MapPath("test.mdb")
'Skapar ett objekt som heter rs som används för att hämta ut info från vår kära databas.
Set rs = Server.CreateObject("ADODB.Recordset")
'Här kommer en sk. Sql-query (Sql-fråga) som används för att bestämma vad man vill hämta ut. I det här fallet all info som finns i tabellen Testtabell, sorterat på ID-nummer.
sql = "SELECT * FROM Testtabell ORDER BY ID"
'Säger åt scriptet att köra frågan mot databasen och se vad den hittar
rs.Open sql, db
'Skapar en loop som går igenom varje post i databasen och gör någonting för varje post. När rs.Eof = True har man skrivit ut alla poster som finns och då ska den sluta skriva ut någonting.
Do Until rs.EOF = True
'Skriver ut data från kolumnen ID och från kolumnen Testnamn i en mening
Response.Write "Nummer "&rs("ID")&" heter "&rs("Testnamn")&".<br>"
'Gå till nästa post i databasen
rs.MoveNext
'Här tar loopen slut...
Loop
%>
Reslutatet borde bli något som;
Nummer 1 heter Arne Svensson.
Nummer 2 heter Sven-Bertil Tallbarrsson.
Nummer 3 heter Kerstin Übersturmer.
Kanske lite knöligt att förstå men du får fråga igen annars. Ska lägga in ett avsnitt om databaser i min Asp skola vid ett senare tillfälle.
Tack!
ASP sidan skall använda information från tidigare sidor (som är sparade som Session) för att göra en enkel hemsida, koden där uppe (där felet ligger) skall logga IP-adressen av de som använder funktionen i databasen (så det kan användas senare för att förhindra missbruk) men jag får felmeddelandet:
ADODB.Recordset- Error '800a0bb9'
Parametrarna är felaktiga, ligger utanför tillåtet intervall eller skapar en inbördes konflikt.
Koden är:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.Open Server.MapPath("IP.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
%>
<HTML>
<HEAD><TITLE>Gör din egen webbsida - 5(5)</TITLE></HEAD>
<BODY>
<%
namn = Session("namn")
IP = request.ServerVariables("REMOTE_ADDR")
Datum = Now
[Denna Rad]sq1= "INSERT INTO IP (Namn, IP, Datum) Values (namn, IP, Datum)"[/Denna Rad]
rs.Open sql, db
path = Server.MapPath("/Mezox")
fil = path & "/Hemsida/" & Session("url")
Set MittTxtObj = CreateObject("Scripting.FileSystemObject")
Set MinFil = MittTxtObj.CreateTextFile(fil,True)
MinFil.WriteLine("<HTML><HEAD><TITLE>" & Session("rubrik") & "</TITLE></HEAD>")
MinFil.WriteLine("<BODY BGCOLOR =" & Session("bfarg") & " TEXT = "& Session("tfarg") & ">")
MinFil.WriteLine("<H1><CENTER>")
MinFil.WriteLine(Session("rubrik"))
MinFil.WriteLine("</CENTER></H1>")
MinFil.WriteLine(Session("text"))
MinFil.WriteLine("<HR>")
MinFil.WriteLine("<CENTER>Denna sida skapades" & date & " av <A HREF = mailto:"& Session("epost") & ">" & Session("namn") & "</A>")
MinFil.WriteLine("</CENTER></BODY></HTML>")
MinFil.Close
%>
<H1>Gör din egen webbsida</H1>
<H2>Steg 5(5) - Sidan är skapad</H2>
Klicka <A HREF = <%=Session("url")%>>här</A> för att gå till den!
</BODY></HTML>
Jag markerade raden där felet ska ha uppstått enligt meddelandet med en text där det står "Denna Rad".
Hehe, har också den där boken :)
Du är medveten om att du skapar en variabel som heter sq1 men ansluter till databasen med en som heter sql? Nu borde det visserligen ge fel på raden efter istället men det är hursomhelst fel :P.
Oj, i Dreamwever är de identiska...
Jag fick ett nytt felmeddalende, den säger att jag saknar nödvändiga parametrar på ungefär samma ställe (raden under).
Jag misstänker att jag måste ange var i databasen jag skriver men vet inte hur.
Jag vill att den ska starta på en ny rad.
Jag bläddrade i boken och hittade något nytt (man skapar raden, ändrar värdena och updaterar). Men jag får felmeddelandet, att databasen är "read-only", vad ska jag göra så ASP-sidan ska ha behörighet att ändra databasen?
Såhär lyder koden nu:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.Open Server.MapPath("IP.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
%>
<HTML>
<HEAD><TITLE>Gör din egen webbsida - 5(5)</TITLE></HEAD>
<BODY>
<%
namn = Session("namn")
IP = request.ServerVariables("REMOTE_ADDR")
Email = Session("epost")
sql= "SELECT * From IP WHERE 1=2"
rs.Open sql, db, 1, 2
rs.AddNew
rs("IP") = IP
rs("Namn") = namn
rs("Email") = Email
rs("Datum") = Now
rs.update
rs.close
path = Server.MapPath("/Mezox")
fil = path & "/Hemsida/hemsidorna/" & Session("url")
Set MittTxtObj = CreateObject("Scripting.FileSystemObject")
Set MinFil = MittTxtObj.CreateTextFile(fil, True)
MinFil.WriteLine("<HTML><HEAD><TITLE>" & Session("rubrik") & "</TITLE></HEAD>")
MinFil.WriteLine("<BODY BGCOLOR =" & Session("bfarg") & " TEXT = "& Session("tfarg") & ">")
MinFil.WriteLine("<H1><CENTER>")
MinFil.WriteLine(Session("rubrik"))
MinFil.WriteLine("</CENTER></H1>")
MinFil.WriteLine(Session("text"))
MinFil.WriteLine("<HR>")
MinFil.WriteLine("<CENTER>Denna sida skapades" & date & " av <A HREF = mailto:"& Session("epost") & ">" & Session("namn") & "</A>")
MinFil.WriteLine("</CENTER></BODY></HTML>")
MinFil.Close
%>
<H1>Gör din egen webbsida</H1>
<H2>Steg 5(5) - Sidan är skapad</H2>
Klicka <A HREF = <%=Session("url")%>>här</A> för att gå till den!
</BODY></HTML>
Felmeddelande:
Microsoft JET Database Engine error '80040e09'
Cannot update. Database or object is read-only.
/Mezox/Hemsida/steg5.asp, line 22
Hm, nu använder du nån slags specialmetod för att syssla med databasen. Skulle gissa på att det är nån etta som ska vara en tvåa eller något sånnt... bättre att använda Sql, då är man dessutom rätt framtidssäker om man skulle stöta på någon annan slags databas än Access. Kan vara själva databasfilen som är skrivskyddad också.
Frågan är bara varför du ska hämta ut saker från databasen om du egentligen vill infoga något i den...?
Enklast är ju helt enkelt;
Sql="INSERT INTO Testtabell (Falt1,Falt2) VALUES ('Nånting,'Något annat')"
db.Execute Sql
Jag hämtar ut ingenting alltså "allt från inget"
Jag "selectar" alla fält där 1 är lika med två, alltså öppnar jag databasen utan att öppna något sen lägger jag till rader och ändrar värdena. Men skulle tro att det är bättre att göra som du.
Fortfarande samma felmeddelande, "jag saknar nödvändiga parametrar".
Om det är ungefär samma script igen så finns det åtminstone ett skäl till att det inte funkar; det finns förmodligen ingen kolumn i databasen som heter 1 som kan vara lika med talet 2. WHERE filtrerar bort de databasposter som inte stämmer med villkoret, men det testar inte om talet 1 = talet 2 utan om någon cell i kolumnen 1 = talet 2. Hänger du med?
Jag använder följande kod nu:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.Open Server.MapPath("IP.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
%>
<HTML>
<HEAD><TITLE>Gör din egen webbsida - 5(5)</TITLE></HEAD>
<BODY>
<%
namn = Session("namn")
IP = request.ServerVariables("REMOTE_ADDR")
email = Session("epost")
sql= "INSERT INTO IP (Namn, IP, Email) Values (namn, IP, email)"
[Denna Rad]rs.Open sql, db[/Denna rad]
path = Server.MapPath("/Mezox")
fil = path & "/Hemsida/" & Session("url")
Set MittTxtObj = CreateObject("Scripting.FileSystemObject")
Set MinFil = MittTxtObj.CreateTextFile(fil,True)
MinFil.WriteLine("<HTML><HEAD><TITLE>" & Session("rubrik") & "</TITLE></HEAD>")
MinFil.WriteLine("<BODY BGCOLOR =" & Session("bfarg") & " TEXT = "& Session("tfarg") & ">")
MinFil.WriteLine("<H1><CENTER>")
MinFil.WriteLine(Session("rubrik"))
MinFil.WriteLine("</CENTER></H1>")
MinFil.WriteLine(Session("text"))
MinFil.WriteLine("<HR>")
MinFil.WriteLine("<CENTER>Denna sida skapades" & date & " av <A HREF = mailto:"& Session("epost") & ">" & Session("namn") & "</A>")
MinFil.WriteLine("</CENTER></BODY></HTML>")
MinFil.Close
%>
<H1>Gör din egen webbsida</H1>
<H2>Steg 5(5) - Sidan är skapad</H2>
Klicka <A HREF = <%=Session("url")%>>här</A> för att gå till den!
</BODY></HTML>
Felmeddelande:
Microsoft JET Database Engine error '80040e10'
No value given for one or more required parameters.
/Mezox/Hemsida/steg5.asp, line 18
Du får använda db.Execute istället för rs.Open om du vill göra något annat än läsa poster. ;)
dvs.
db.Execute Sql
Tack, nu har jag koden (men det funkar fortfarande inte):
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.Open Server.MapPath("IP.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
%>
<HTML>
<HEAD><TITLE>Gör din egen webbsida - 5(5)</TITLE></HEAD>
<BODY>
<%
namn = Session("namn")
IP = request.ServerVariables("REMOTE_ADDR")
email = Session("epost")
sql= "INSERT INTO IP (Namn, IP, Email) Values (namn, IP, email)"
db.Execute sql, 1, 2
path = Server.MapPath("/Mezox")
fil = path & "/Hemsida/" & Session("url")
Set MittTxtObj = CreateObject("Scripting.FileSystemObject")
Set MinFil = MittTxtObj.CreateTextFile(fil,True)
MinFil.WriteLine("<HTML><HEAD><TITLE>" & Session("rubrik") & "</TITLE></HEAD>")
MinFil.WriteLine("<BODY BGCOLOR =" & Session("bfarg") & " TEXT = "& Session("tfarg") & ">")
MinFil.WriteLine("<H1><CENTER>")
MinFil.WriteLine(Session("rubrik"))
MinFil.WriteLine("</CENTER></H1>")
MinFil.WriteLine(Session("text"))
MinFil.WriteLine("<HR>")
MinFil.WriteLine("<CENTER>Denna sida skapades" & date & " av <A HREF = mailto:"& Session("epost") & ">" & Session("namn") & "</A>")
MinFil.WriteLine("</CENTER></BODY></HTML>")
MinFil.Close
%>
<H1>Gör din egen webbsida</H1>
<H2>Steg 5(5) - Sidan är skapad</H2>
Klicka <A HREF = <%=Session("url")%>>här</A> för att gå till den!
</BODY></HTML>
Felmeddelande:
Microsoft JET Database Engine error '80040e14'
Syntax error in FROM clause.
/Mezox/Hemsida/steg5.asp, line 18
1, 2 som står efter dbExecute sql tror jag är någon slags inställning som behövs när man använder den metoden som du använde först för att öppna databasen. Men den behövs normalt inte och framförallt så hör den till Recordset-objektet som används för att hämta ut poster. Med andra ord så ska du ta bort ", 1, 2".
Men då står det att jag saknar nödvändiga parametrar.
Hur kunde jag missa det? Säkert något mer fel som jag har missat men hursomhelst.
Nu tolkar Sql det som att du vill sätta in något som den inte riktigt vet vad det är i databasen. Det är ingen text för det står inte inom citattecken. Det är inget tal. Men det är ingen variabel heller, varför det inte är det blir lite omständigt att förklara, men du får istället göra såhär;
"INSERT INTO IP (Namn, IP, Email) Values ("&namn&", "&IP&", "&email&")"
Men det räcker inte med det utan det är text som du vill sätta in eller hur? Och text skriver vi... inom citattecken.
Problemet är ju att det är inte ordet namn eller IP vi vill sätta in. Varför då citattecken? Jo, om vi tar koden jag postade alldeles ovan så sätter den in variablerna i Sql-strängen. Om vi skulle köra koden så skulle Sql-strängen se ut såhär om namn var nico, IP var 127.0.0.0 och email var [email protected]:
INSERT INTO IP (Namn, IP, Email) Values (nico, 127.0.0.0, [email protected])
Alltså får vi använda citattecken runtom. Men gissa vad; det räcker inte med det! :P
Om du skulle skriva dit ett dubbelt citattecken, ja då skulle du ju avsluta strängen med värdet för variabeln Sql som vi nu håller på och skapar så vi måste använda enkla istället. Nu funkar iaf det! :)
"INSERT INTO IP (Namn, IP, Email) Values ('"&namn&"', '"&IP&"', '"&email&"')"
Tack, men ett nytt fel:
Microsoft JET Database Engine error '80004005'
Operation must use an updateable query.
/Mezox/Hemsida/steg5.asp, line 18
Nu är det iaf inget fel på koden, funkar dessutom utmärkt på min server. Men kolla att;
¤Databasen inte är skrivskyddad.
¤Att alla användare kan läsa och skriva till mappen där databasen ligger.
¤Databasen inte är öppen.
Hu rkontrollerar jag de två första punkterna (jag använder WebNG)
Mhm... webbaserad FTP är ju alltid lite krångligare. Men kolla om du kan hitta något som heter File Permissions eller liknande. Har för mig att det finns dels en förenklad FTP/upload och så en mer avancerad på WebNG. Det skulle kunna finnas rätt inställningar i den avancerade versionen.