Jag skall bygga en site, med målsättning att ha fler än 500 besökare per dag Access är till och med väldigt bra i vissa läggen. Är det mest Read-only funkar det ok med Access på en sajt med hundratals besök/dag. Har du däremot många update/delete så kommer du eventuellt att få problem om du inte väldigt noga lär dig hur man undviker problemen.. Så jag skall iaf öppna och stänga databasen på varje sida? Förutom det som Henkoz skrev så kommer din connection vara öppen för besökaren under dennes hela besök samt (som standard) 20 minuter efter. Detta gör att du kan få väldigt många connections öppna samtidigt. Access måste nog vara jordens mest underskattade databas! med www.google.com hittar du exempel på allt mellan himmel och jord. Ok jag förstår att jag skall använda getRow Sessionobjekt tar upp minne på servern och med många användare samtidigt blir det mycket minne... Jag har personligen fått väldigt mycket hjälp här på forumet, därför så skall ge igen, och ge dig lite matnytigt. TACK så jättemycket för det utförliga svaret! Borde jag inte stänga connection redan direkt efter jag kört arr=rst.GetRows() ?? <b>Finns det någon prestandamässig fördel att databasöppningen ligger i en includefil?</b> Jag uppmanar att alla som väljer att inkludera en conection inte gör som saw föreslår. Det finns ett mycket bättre sätt. Jag uppmanar att alla som väljer att inkludera en conection inte gör som saw föreslår. Det finns ett mycket bättre sätt. Ok, ----------------------------------------- Ett komplement till egenskaperna för Response.Buffer = False. Du kan inte använda Response.Redirect om buffer är satt till false. Dock som du skriver, ett mycket uttömmande svar, bra jobbat. Man kan Response.Redirect(). Dock förutsätter det att ingen text har skrivits ut. Här fick jag många uttämmande svar! tackar! Det är fråger som saknar större djup. Du kan själv sök svar på det i ADO dokumentationen på msdn: http://msdn.microsoft.com/library/en-us/ado270/htm/adostartpage1.asp Jag förtår inte riktigt vadASP och databas, vad använda
Vad bör jag använda för teknik?
Jag behärskar ASP coh acess databas, men har hört mycket skit om acess.
Kan jag anävända acess ändå om jag t.ex. läser in all data i sessioner i t.ex. global.asa?
Eller bör jag lära mig något annan databas och ifs vilken, mySQL??
Jag har även ganska ont om tid med projektet, vad är enklast kontra bäst att lära sig om nu inte access duger?
Tacksam för svar?Sv: ASP och databas, vad använda
Access duger visst som databas, man ska inte lyssna på allt skit som folk pratar.
Dina ev 500 besökare är nog knappast inne exakt samtidigt och ställer frågor mot databasen.
//Anna-KarinSv: ASP och databas, vad använda
Jag kan berätta om en kamrat som hadde en databas med ca: 400 000 poster och han hadde registrerat över 40 SAMTIDA sökningar, så det behöver inte vara något problem, om du bygger upp det förståndigt.
Använd INTE global.asa och session.
Använd istället include-filer på varje sida med din databas-connection.
Öppna och stäng din databas så fort som möjligt.
Använd dig gärna av GetRows.
Än en gång, glöm inte att vara noga med att stänga dina object.
Lycka tillSv: ASP och databas, vad använda
Kolla här för mer info:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnacc2k/html/adoproperties.aspSv: ASP och databas, vad använda
varför är det bättre att ha det i include filer?
Och varför är det dåligt att vid start lägga in det i sessions, då behöver man ju bara öppna databasen en gång per användare ? , jag är lite rookie på det här..Sv: ASP och databas, vad använda
/JohanSv: ASP och databas, vad använda
Så fruktansvärt enkel att använda och funkar till de flesta mindre lösningar.
Och behöver man kliva upp till tex. SQL Server så är det oftast enkelt att göra.
MEN, man bör ha i åtanke att Access aldrig är byggd för att hantera många samtidiga användare så det kan uppstå problem just därför.
Men har men det i åtanke och är medveten om de problem som kan uppstå klarar man sig väldigt länge med Access.
När man kör ADO skall man alltid stänga sitt Connection-objekt så for det bara går.
Detta så något som kallas Connection-pooling skall fungera som det ska.
Det innebär att när du gör en anslutning så "cachar" systemet den anslutingen, eller så att säga lägger den till en anslutnigs-pool.
Öppnar du sedan en ny anslutning med SAMMA anslutnigsinfo. så hämtas anslutningen från poolen och inte behöver skapas på nytt.
Så det bästa/effektivaste förslaget borde vara att använda GetRows som föreslås tidigare och stänga anslutningen direkt efter.
/JohanSv: ASP och databas, vad använda
Prova tex att söka efter GetRows asp
Där hittar du flera bra länkar direkt.Sv: ASP och databas, vad använda
Men varför är det inte bra att läsa in datan i session objekt istället för att öppna databasen på nytt på varje sida?Sv: ASP och databas, vad använda
Dessutom, har användaren inte cookies påslagna fungerar inte sessioner...
Sista vet jag inte säkert, men har sett många som påstår det så varför kan det inte vara sant ;)
Mvh,
ThomasSv: ASP och databas, vad använda
Först include filen:
<code>
<%
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & server.MapPath("(data/allt.mdb")
'
%>
</code>
Detta innebär att sett ifrån roten på webbplatsen, så finns det en mapp som heter data, och i den ligger en databas som heter allt.mdb.
Överst på asp-sidan:
<code>
<!--#include filedataconn.asp"-->
</code>
...här lägs includefilen in, som i detta fallet ligger i roten.
Sen i asp-sidan...
<code>
Dim con,rst,strSQL,arr
strSQL = "SELECT a_Id,Datum,Titel,Innehall FROM t_Arkiv Order BY Datum"
set rst= con.execute(strSQL)
If Not rst.EOF Then
arr=rst.GetRows()
rst.Close
</code>
Dimma variablerna, fixa till en SQL, och exekevera den. Därefter lägger vi recordsetet i en array (GetRows), samt stänger recordsetet.
<code>
For i = 0 TO Ubound(arr,2)
sID=arr(0,i)
sDatum=arr(1,i)
sTitel=arr(2,i)
sInnehall=arr(3,i)
</code>
..sen gäller det att ta ut variablerna ifrån arrayen.
<code>
Response.Write sID & vbCrlf
Response.Write sDatum & vbCrlf
Response.Write sTitel & vbCrlf
Response.Write sInnehall& vbCrlf
</code>
...sen kan vi skriva ut variablerna
<code>
NEXT
</code>
...och avsluta med next.
Om du är på slutet av sidan, glöm inte att stänga din connection.Sv: ASP och databas, vad använda
Finns det någon prestandamässig fördel att databasöppningen ligger i en includefil?Sv: ASP och databas, vad använda
Sv: ASP och databas, vad använda
Nej, tvärt om, det bästa är givetvis att inte använda includefiler, men det är ganska jobbigt att underhålla som man behöver ändra connectionstring i alla sina filer.
<b>Borde jag inte stänga connection redan direkt efter jag kört arr=rst.GetRows() ??</b>
Jo, du ska sträva efter att ha din connection öppen så kort tid som möjligt.
/Johan
Sv: ASP och databas, vad använda
Det är kapsla öppningen i en Specifik Function:
<code>
<%
'Generella hjälp funktioner
Function OpenConnection(ConnectionString)
Dim con
Set con = Server.CreateObject("ADODB.Connection")
con.Open ConnectionString
Set OpenConnection = con
End Function
Function OpenJETConnection(DataSource)
Set OpenJETConnection = OpenConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataSource)
End Function
'Specifika deklarerade anslutningar
Function OpenMyDatabas()
Set OpenMyDatabas = OpenJETConnection(Server.MapPath("/../Database/MyDatabas.mdb"))
End Function
Function OpenNorthwind()
Set OpenNorthwind = OpenJETConnection(Server.MapPath("/../Database/Northwind.mdb"))
End Function
%>
</code>
Denna implementering har många fördelar. Några av dem är:
* Är inte beroende av deklarerade variabler
* Öppnar bara anslutningar när det anropas
Exempel Sida:
<code>
<%@ Language=VBScript %><%Option Explicit: Response.Buffer = True%><!--include file="MinaAnslutningar.asp" --><%
Dim con
Dim rst
Dim strSQL
strSQL = "SELECT a_Id, Datum, Titel, Innehall FROM t_Arkiv ORDER BY Datum"
Set con = OpenMyDatabas()
Set Rst = con.Execute(strSQL)
If Rst.EOF Then
Else
Response.Write Rst.GetString()
End If
Rst.Close
Set Rst.ActiveConnection = Nothing
Set Rst = Nothing
con.Close
Set con = Nothing
Response.End
</code>
Detta exempel retunerar resultatet som en tab-separerad textfil.
Jag uppmanar alla som läser denna tråden att sprida informationen vidare. För att på så sätt höja kvaliteten på program strukturen i ASP sidor.Sv: ASP och databas, vad använda
Det är kapsla öppningen i en Specifik Function:
<code>
<%
'**
'* Generic Help Functions
'**
Function OpenConnection(ConnectionString)
Dim con
Set con = Server.CreateObject("ADODB.Connection")
con.Open ConnectionString
Set OpenConnection = con
End Function
Function OpenJETConnection(DataSource)
Set OpenJETConnection = OpenConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataSource)
End Function
'**
'* Exampels of server connections
'**
'Correct and/or best way of opening a connection in ASP
Function OpenNorthwind()
Set OpenNorthwind = OpenJETConnection("C:\Program\Microsoft Visual Studio\VB98\NWIND.MDB")
End Function
'Correct and most common way of opening a connection in ASP
Function OpenMyDatabas()
Set OpenMyDatabas = OpenJETConnection(Server.MapPath("./MyDatabas.mdb"))
End Function
%>
</code>
Denna implementering har många fördelar. Några av dem är:
* Är inte beroende av deklarerade variabler
* Öppnar bara anslutningar när det anropas
Exempel Sida:
<code>
<%@ Language=VBScript %><%
Option Explicit
Response.Buffer = True
%>
<!--#include file="MyConnections.asp" -->
<%
Dim con
Dim rst
Dim strSQL
strSQL = "SELECT Orders.* FROM Orders"
Set con = OpenNorthwind()
Set Rst = con.Execute(strSQL)
If Rst.EOF Then
Else
Response.Write Rst.GetString()
End If
Rst.Close
Set Rst.ActiveConnection = Nothing
Set Rst = Nothing
con.Close
Set con = Nothing
Response.End
%>
</code>
Detta exempel retunerar resultatet som en tab-separerad textfil.
Jag uppmanar alla som läser denna tråden att sprida informationen vidare. För att på så sätt höja kvaliteten på program strukturen i ASP sidor.Sv: ASP och databas, vad använda
Vad betyder:
Rst.GetString()
och
Option Explicit
Response.Buffer = TrueSv: ASP och databas, vad använda
Option Explicit
-----------------------------------------
Lägger man innan koden om man vill att VB skall kräva deklaration av variabler. Med Option Explicit undviker man buggar som beror på felstavat variabelnamn. Stavar man fel på variabelnamnet kommer då sidan att klaga på at variabeln inte är deklarerad.
Exempel på ett exempel på ett fel som Option Explicit "uptäcker":
<code>
Option Explicit
Dim FirstName
'FirstNamn är en odeklarerad variabel. Det skall vara FirstName!
FirstNamn = Trim(Request.Form("FirstName"))
If Len(FirstName) Then
'OK
Else
'Not ok
End If
</code>
Om man inte använt Option Explicit, skulle inget fel rapporterats när koden körs.
Men FirstName kommer var tom oavsett vad Request.Form("FirstName") innehåller.
Detta är för att vb kommer att tokla FirstNamn som en variabel av typen Variant. Detta är ett tidigt arv från vb för att låta programerarna "slippa" deklarera sina variabler. Vilket i sig är en hemsk "funktion".
Det skulle krävas mycket noggran kontroll av koden innan man upptäcker att man stavat fel till FirstName där värdet tilldelas till variabeln.
Om man använt Option Explicit kommer inte koden gå at köra eftersom variabeln FirstNamn inte är deklarerad.
-----------------------------------------
Response.Buffer = True
-----------------------------------------
Om man i ASP använder Response.Buffer = False:
* Response.Write skickar data till klient
* Response.Flush implementeras ej
* Response.Clear implementeras ej
* Response.End avbryter exekvering av sidan
Om man istället använder Response.Buffer = True:
* Response.Write skriver till en buffert istället för att skicka data till klient
* Response.Flush skickas data i buffert till klient och tömmer buffert
* Response.Clear tömmer buffert på data utan att skicka till klient.
* Response.End skickas data i buffert och avbryter därefter exekvering av sidan
-----------------------------------------
ADODB.Recordset.GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)
-----------------------------------------
GetString() är en metod på ADODB.Recordset objektet vilket slås samman antalet angivna poster(NumRows) från aktuell position i recordsetet.
Om det saknas aktuell post kommer ett fel att upstå. Det är därför bäst att först kontrollera att recordsetet inte befinner sig BOF eller EOF. Om recordsetet nyss öppnats räcker det att kontrolera att det inte befinner sig EOF.
StringFormat är reserverad för framtiden. Kan utelämnas eller anges till konstanten
adClipString(vilket motsvarar av värdet 2).
NumRows anger hur många poster som skall behandlas av medlemen. Kan utelämnas och då kommer resterande poster att behandlas.
Kolumnseparator(ColumnDelimiter) anger en sträng som skall separera kolumner/fält. Kan utelämnas och då används tab-tecknet. Tab-tecknet motsvarars av vb konstant vbTab.
Radseparatorn(RowDelimiter) anger en sträng som skall separera poster. Kan utelämnas kommer poster att separeras genom radbrytning. radbrytning representeras av en två tecken lång sträng bestående av "carrier return"-tecknet("carrier return"-tecknet motsvarars av vb konstanten vbCr) tillsamans med "line feed"-tecknet("line feed"-tecknet motsvarars av vb konstanten vbLf). "carrier return"-tecknet tillsamans med "line feed"-tecknet motsvarars av vb konstanten vbCrLf.
När funktionen körs:
* Nullvärden ersätts med strängen angiven i parametern NullExpr.
* Värden i poster slåss sammans till en sträng separerade med angiven kolumnseparator(ColumnDelimiter).
* Strängarna som representerar varje post slås samman separerade med angiven radseparatorn(RowDelimiter).
Detta innebär att dessa två uttryck retunerar identisk sträng:
<code>
rs.Open "SELECT * FROM Orders", con
If NOT rs.EOF Then
Response.Write rs.GetString()
End If
rs.Close
</code>
Och:
<code>
rs.Open "SELECT * FROM Orders", con
If NOT rs.EOF Then
Response.Write rs.GetString(2, -1, vbTab, vbCrLf, vbNullString)
End If
rs.Close
</code>Sv: ASP och databas, vad använda
Sv: ASP och databas, vad använda
T.ex. följande kod bör funger:
<code>
<%@ Language=VBScript %><%
Option Explicit
Response.Buffer = False
Response.Redirect("Redirect.html")
%>
</code>
Medans följande kod inte:
<code>
<%@ Language=VBScript %><%
Option Explicit
Response.Buffer = False
Response.Write ""
Response.Redirect("Redirect.html")
%>
</code>
För att förstå varför det är såhär bör man känna till Hypertext Transfer Protocol(HTTP) . Specifikationen för HTTP finner du på: ftp://ftp.isi.edu/in-notes/rfc2616.txt
Låt oss nu gå in på vad Response.Redirect() gör för något. vilket är att skicka statusen 307(Temporary Redirect) till klienten.
Alltså ett anrop för HTTP novicer och/eller "dummies"(Om ni inte tycker man bör kalla folk som använder Response.Redirect() för dummies. Låt mig då försvara mig med att jag anser att slaviskt bör följa det standarder som berör ämnet. Finns mer elaka saker man kan kalla dem för en "dockor".).
Låt oss kort beskriva hur ett HTP svar ser ut:
Status-Line - Status Code and Reason Phrase
Header Fields
Request och Response kan dessutom innehålla Entity, vilket i asp iprincip är resulterande html sida.
HTTP stödjer bar en status i ett svar. Det är nu mycket lätt att förstå i vilka fall det inte är tillåtet att anropa Response.ReDirect.
Dessa är om man skickat några Header Fields och/eller påbörjat en Entity.
Nu gäller det att sätta sig in i hur ASP skickar sitt svar. Kort kan man säga att man inte bör på något sätt ändrat informationen för någon egenskap i Response objektet. Specielt inte Response.Write eller Response.AddHeader().
Ni kanske frågar var för följande sida inte fungerar:
<code>
<%@ Language=VBScript %><%
Option Explicit
Response.Buffer = False
%>
Nu ska vi se om jag kan göra en ReDirect
<%
Response.Redirect("Redirect.html")
%>
</code>
Man kan tro att den inte anropar Response objektet. Men det stämmer inte. ASP översätter sidan till vb kod. Vilket innebär att det Script motorn tolkar är följande kod:
<code>
Option Explicit
Response.Buffer = False
Response.Write vbCrLf & "Nu ska vi se om jag kan göra en ReDirect" & vbCrLF
Response.Redirect("Redirect.html")
</code>
Jag hoppas att inga oklarheter kvarstår vad det gäller Response.ReDirect och varför jag anser att man inte bör använda den utan legitima själ. På samma sätt som USA borde haft Legitima skäl för att starta krig mot Irak. Inte hitta på något för att starta krig, avsätta saddam och plundra landet. Vilket i princip är de det gjort.Sv: ASP och databas, vad använda
När vi ändå är på gång har jag två frågor till:
När skall man använda RS.Open och vad gör den?
och vad innebär:
Connection.Mode = 3Sv: ASP och databas, vad använda
Du får inte bli bortskämd och inte ställa lätta fråger vilket svaret du kan finna själv.
JAg har valt att ge mycket utförliga svar tidigare för att utbilda alla, Det är inte många som känner till tekniken bakom Respons.Redirect, http, kapslar öppningsanrop av dconnections i funktioner, osv.
JAg tog tillfälet i akt att i detta inläg besvara det.Sv: ASP och databas, vad använda
Set Rst.ActiveConnection = Nothing
är för något?