Hej Tror detta fungerar: tack! jättesnällt, det funkade klockrent! Connect.Execute(strSQL) är det som kör din Update, där vill du inte ha tillbaka något svar. Du behöver inte öppna anslutningen två gånger. Utan kan skriva: hej Koden för att använda ett command skulle se ut så här: Hej För att den inte skalla vara tillgänglig från nätet är det ofta bättre att inte lägga den under WWWROOT katalogen alls. Utan skapa en helt egen katalog. I utforskaren kan man sedan tilldela ASP kontot rättigheter. Kontot vilket ASP motorn kör under brukar vara IUSER_<Datornamn>. T.ex. IUSER_LAPTOP om min dator Heter LAPTOP. Andreas, skulle du vilja förklara vad denna gör i sina parametrar och hur den samspelar med CommandText vid Update-körningen? Normalt förklaras dessa i dokumentationen. En programmerar gör sig vän med dokumentationen. Stort Tack för din förklaring!SQL-fråga - två till en
Jag undrar om man kan "sätta ihop" dom här två till en, eftersom det är samma databas (klick.mdb) så tycker jag det borde gå..? Men hur ser det ut i sånna fall?
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("klick.mdb")
' Uppdaterar antalet klick
strSQL = "UPDATE saba SET klick = klick + 1 WHERE id = " & Request.Querystring("id")
Connect.Execute(strSQL)
Connect.Close: Set Connect = Nothing
%>
och
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("klick.mdb")
' Uppdaterar antalet klick
strSQL = "UPDATE saba SET klicktotalt = klicktotalt + 1 WHERE id = " & Request.Querystring("id")
Connect.Execute(strSQL)
Connect.Close: Set Connect = Nothing
%>
/NinaSv: SQL-fråga - två till en
<code>
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("klick.mdb")
' Uppdaterar antalet klick
strSQL = "UPDATE saba SET klick = klick + 1, klicktotalt = klicktotalt + 1 WHERE id = " & Request.Querystring("id")
Connect.Execute(strSQL)
Connect.Close: Set Connect = Nothing
%>
</code>
/MickeSv:SQL-fråga - två till en
kan man även sätta ihop två sånna här:
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("handelser.mdb")
' Uppdaterar antalet klick
strSQL = "UPDATE handelse SET klick = klick + 1 WHERE id = " & Request.Querystring("id")
Connect.Execute(strSQL)
Connect.Close: Set Connect = Nothing
Set Connect = Server.CreateObject("ADODB.Connection")
Set RecSet = Server.CreateObject("ADODB.Recordset")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("handelser.mdb")
strSQL = "SELECT * From handelse WHERE id = " & Request.QueryString("id")
RecSet.Open strSQL, Connect
%>
mvh NinaSv: SQL-fråga - två till en
RecSet.Open strSQL, Connect, är det som kör din selectsats och du får svaret till RecSet.
Så du kan alltså inte slå ihop dessa två.
//Anna-KarinSv: SQL-fråga - två till en
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("handelser.mdb")
' Uppdaterar antalet klick
strSQL = "UPDATE handelse SET klick = klick + 1 WHERE id = " & Request.Querystring("id")
Connect.Execute(strSQL)
Set RecSet = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT * From handelse WHERE id = " & Request.QueryString("id")
RecSet.Open strSQL, Connect
RecSet.Close: Set RecSet = Nothing
Connect.Close: Set Connect = Nothing
%>
Eventuellt kan du öppna recordsetet redigerbart, Låsa applikationen göra uppdateringen och låsa upp.
Låsa för att hindra att race condition uppstår. Du får testa vilket av tillvägagångssätten som är effektivast.
Dessutom bör du läsa dig in på SQL inject. Då dina kod är mottaglig mot dessa angrepp.
JAg rekomenderar att lösa detta genom att använda ett command objekt med paramterar.
Sv:SQL-fråga - två till en
det där sista förstod jag inte "ett command objekt med parameter" ?
har du ett enkelt tips så tar jag gärna emot det ;-)
/ninaSv: SQL-fråga - två till en
<%
Dim con
Dim cmd
Const adInteger = 3
Const adParamInput = 1
Const adExecuteNoRecords = 128
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("handelser.mdb")
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = con
cmd.CommandText = "UPDATE handelse SET klick = klick + 1" & vbCrLf & _
"WHERE id = @id"
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, , Request.Querystring("id"))
cmd.Execute , , adExecuteNoRecords
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
con.Close
Set con = Nothing
%>
Din site lider dessutom av en annan alvarlig säkerhets brist. Din databas ligger i en mapp tillgänglig från nättet. Därför kan vem som helst ladda ner den.
Du bör lägga databaser i en katalog som inte är tillgänglig från nätet men där asp kontot har läs och skrivrättigheter.
Sv:SQL-fråga - två till en
hur menar du när du skriver "inte är tillgänglig från nätet?"
en underkatalog till där jag har mina andra filer? Men kan inte vem som helst komma åt den också?
hur sätter man så att aspkontot har läs och skrivrättigheter till katalogen?Sv: SQL-fråga - två till en
Sv:SQL-fråga - två till en
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, , Request.Querystring("id"))
Mvh Micke
Sv: SQL-fråga - två till en
Konstanter är deklarerade i adovbs.inc så man kan välja att inkludera denna eller lägga in en meta tag för ADO's typlibary.
Förstaparametern: Namn på paramtern om platshållaren för parametern är anonym. Det vill säga att det är ett frågetecken har inte namnet betydelse utan dess matchas genom ordning av frågetecknet i frågan samt ordningen av parametern i paramer samlingen.
Andraparametern: Datatyp för parametern. adInteger för heltal och adVarChar för strängar är det två vanligaste.
Tredjeparamtern: Riktning på paramtern. Är det för input till frågan, output eller båda.
Fjärdeparamtern: Storlek på fältet. Bara nödvändigt för t.ex. stränga och sånt.
Femteparamtern: Initialvärde för paramtern.
Om man har en loop så kan man tjäna på att använda ett command.
Dim I
Dim con
Dim cmd
Dim UserName
Dim UserPassword
Const adInteger = 3
Const adVarChar = 200
Const adParamInput = 1
Const adExecuteNoRecords = 128
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("handelser.mdb")
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = con
cmd.CommandText = "INSERT INTO Users (UserName, UserPassword)" & vbCrLf & _
"VALUE (@Name, @Password)"
UserName = cmd.CreateParameter("@Name", adVarChar, adParamInput, 20)
cmd.Parameters.Append UserName
UserPassword = cmd.CreateParameter("@Password", adVarChar, adParamInput, 20)
cmd.Parameters.Append UserPassword
cmd.Prepered = True
For I = 1 To Request.Form("Count")
UserName.Value = Request.Form("UserName" & I)
UserPassword.Value = Request.Form("UserPassword" & I)
cmd.Execute , , adExecuteNoRecords
Next
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
con.Close
Set con = Nothing
Detta borde ge bättre prestanda.
Sv:SQL-fråga - två till en
Får kolla upp det mer när där finns tid till det.
Återkommer kanske i en annan tråd om jag undrar något mer om detta.
Micke