Hej gott folk, Du bör inte skicka sökvägen till databasen. Detta innbär att man kan läsa skriva till vilken databas som helst. Ja, självklart finns det en hel del kvar att göra innan rutinen är helt fulländad, speciellt ur säkerhetssynpunkt. <code> aha, det var såpass enkelt alltså..... nice, det ska jag testa..låt oss bygga en egen, Generell DB_mod-rutin... (Open source)
Jag har börjat på en generell rutin som automatiskt gör ändringar i en databasen.
Tanken är att från sitt formulär ska man kunna kalla på tex filen "dbMod.asp" där alla i DBn görs. Detta istället för att göra en ny statisk db-mod fil varenda gång.
Här är en del av koden iaf (beskrivning längre ned):
<code>
....
'Ta på ngt sätt reda på om "post" Eller "GET" används. Detta nedan funkar inte men det visar lite hur det är tänkt..
if request.querystring.count > 0 then
with Request.QueryString
else
with Request.form
end
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(.item("dbFile")) & ";User Id=admin;Password=;"
Set objRS = Server.CreateObject("ADODB.Recordset")
.....
if action="add" OR action="update" then
On Error Resume Next
Err.Clear
For i=1 to .Count 'loopa igenom alla värde-par i Querystring/formen
Response.Write .key(i) & " - " & .Item(i) & "-------><BR>"
Set fd = objRS.Fields(.key(i)) 'om fält med detta namn INTE finns-> får vi ett error
Response.Write "Err.Number=" & Err.Number & "<BR>"
If not Err.Number <> 0 Then ' Error, dvs fältet fanns inte, så hoppa över
Response.Write "<BR> objRS('"&.key(i)&"') = " & objRS(.key(i)) & " (datatyp:" &objRS(.key(i)).Type & ")<BR>"
'Fältet finns i db, så fortsätt
if .Item(i) <> "" then
Select case objRS(.key(i)).Type 'Typecaste, beroende på datatyp.
case 3 'Numeric
objRS(.Key(i)) = Cint(.Item(i))
Response.Write "#Numeric# "
case 7 'Date
objRS(.Key(i)) = Cdate(.Item(i))
Response.Write "#Date# "
case 202, 203 'text OR char
objRS(.Key(i)) = .Item(i)
Response.Write "#TextORChar# "
case else
Response.Write "felaktig datatyp<BR>"
end select
else
objRS(.Key(i)) = null
Response.Write "EMPTY FORM<BR>"
end if
else
Response.Write "<BR> objRS('"&.key(i)&"') = <B>NULL</B> -> Error = "&Err.Description &""
end if
Response.Write "<BR><HR>"
Err.Clear
objRS.update
next
on error goto 0
elseif action="del" then 'Radera posten
objRS.Delete adAffectCurrent
else
Response.Write "FELAKTIG ACTION!!"
end if
end with
</code>
I princip så utgår man från att om ett request.form/querystring namn finns i databasen, då uppdaterar/lägger/raderar man detta.
Formuläret bör se ut ngt i stil med detta:
<code>
<FORM action="db_mod.asp" method="get|post">
<INPUT type=hidden name="dBFile" Value="minDB.mdb">
<INPUT type=hidden name="dBTbl" Value="minDBTbl">
<INPUT type=hidden name="dBID" Value="minDBTbl_ID">
<INPUT type=input name="UserName" Value="Bertil Jansson">
<INPUT type=input name="Stad" Value="kiruna">
<INPUT type=submit>
</FORM>
</code>
I fallet ovan skickar man även med databasnamn och tabellnamn.
tex: db_mop.asp?UserName=lasse&ort=kiruna ->
I DBn finns ett fält med namnet Username, eftersom inget IDNr skickats med betyder det att vi lägger till ett fält där UserName=lasse.. å andra sidan finns inget fält som heter "ort" i DBn, så denna ignorerar vi..
Hur bestämma vad som skall göras?
Om man vet vad som skall hända så kan man använda <INPUT type=hidden name="action" Value="add|del|update">. Vill man tabort en rad MÅSTE man skicka med action=del och ID för den raden. Men man behöver inte skicka med action om man skall lägga till eller uppdatera.
Då kan man automatiskt bestämma detta genom:
OM ID<>"" och action="" -> update
OM ID="" och action="" -> add
(koden för detta, samt lite annat har jag inte tait med här)
Ja.. ni fattar nog poängen..
Nu vill jag alltså ha hjälp med att vidareutveckla denna opensource-rutin. Så om du kommer på förbättringar/förslag/ändringar... tveka inte att posta här.Sv: låt oss bygga en egen, Generell DB_mod-rutin... (Open source)
Du bör skydda ditt gränssnitt med login: antingen IIS inbyggda eller ett eget. Om du har et eget databas system se då till att man inte kan öppna den databasen med systemet.
Jag skulle utforma gränssnittet så här:
<FORM action="db_mod.asp" method="get|post">
<INPUT type="hidden" name="ConnectionId" Value="{FF0B8EF7-C902-4D56-BF32-63E6E65D1438}">
<INPUT type="hidden" name="TableId" Value="{822A23A8-D44A-4D09-81A9-6B3A3CDDB0BD}">
<INPUT type="hidden" name="fields(1).name" Value="UserName">
<INPUT type="text" name="fields(1).value" Value="Bertil Jansson">
<INPUT type="hidden" name="fields(2).name" Value="Stad">
<INPUT type="text" name="fields(2).value" Value="kiruna">
<INPUT type="hidden" name="fields.count" Value="2">
<INPUT type="submit" name="action" value="add">
</FORM>
<%
If Request.Form.Count > 0 then
DoStuff Request.Form
ElseIf Request.Querystring.Count > 0 then
DoStuff Request.Querystring
End
Sub DoStuff(Parameters)
Dim I
Dim Field
Dim FieldName
Dim FieldValue
Dim ConnectionString
With Parameters
ConnectionString = GetConnection(.item("ConnectionId"))
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open ConnectionString
Set objRS = Server.CreateObject("ADODB.Recordset")
Select Case action
Case "add", "update"
For I = 1 to .item("fields.count") 'loopa igenom alla värde-par i Querystring/formen
FieldName = .item("fields(" & I & ").name")
FieldValue = .item("fields(" & I & ").value")
Set Field = objRs(FieldName)
If Not IsEmpty(FieldValue) Then
Select case Field.Type 'Typecaste, beroende på datatyp.
case 3 'Numeric
Field.Value = Cint(FieldValue)
Response.Write "#Numeric# "
case 7 'Date
Field.Value = CDate(FieldValue)
Response.Write "#Date# "
case 202, 203 'text OR char
Field.Value = FieldValue
Response.Write "#TextORChar# "
case else
Response.Write "felaktig datatyp<BR>"
end select
Else
Field.Value = Null
Response.Write "EMPTY FORM<BR>"
End If
Next
objRS.update
Case action="del" 'Radera posten
objRS.Delete adAffectCurrent
Case else
Response.Write "FELAKTIG ACTION!!"
End Select
End with
End Sub
Något åt det hållet i alla fall.
I princip så utgår man från att om ett request.form/querystring namn finns i databasen, då uppdaterar/lägger/raderar man detta.
Formuläret bör se ut ngt i stil med detta:
Sv:låt oss bygga en egen, Generell DB_mod-rutin... (Open source)
I mitt fall så spelar det ingen roll, då sidan ligger på företagets intranät och skyddas således på en högre nivå med bla inloggning.
Men visst kan man göra som Andreas skrev.
Tack Andreas, fick nu svar på hur jag skulle ha löst detta:
<code>
If Request.Form.Count > 0 then
DoStuff Request.Form
ElseIf Request.Querystring.Count > 0 then
DoStuff Request.Querystring
End
</code>
Jag provade nämligen med:
<code>
dim req
If Request.Form.Count > 0 then
req = Request.Form
ElseIf Request.Querystring.Count > 0 then
req = Request.Querystring
End
...
with req
.item("xxx")
</code>
Men fick det inte att fungera..
En sak förstår jag dock inte. Varför har du valt:
<code>
<INPUT type="hidden" name="fields(2).name" Value="Stad">
<INPUT type="text" name="fields(2).value" Value="kiruna">
</code>
istället för:
<code>
<INPUT type="text" name="stad" Value="kiruna">
</code>
Vad blir skillnaden? (Bortsett från att det blir en rad mer)
Har för mig att jag provade: <code>If Not IsEmpty(FieldValue) Then </code> men fick error då fältnamnet inte existerar, därför fick jag köra på en error.number <> 0 lösningen. Sv: låt oss bygga en egen, Generell DB_mod-rutin... (Open source)
dim req
If Request.Form.Count > 0 then
req = Request.Form
ElseIf Request.Querystring.Count > 0 then
req = Request.Querystring
End
...
with req
.item("xxx")
</code>
Detta funkar om du använder "Set req = Request.Form" och "Set req = Request.QueryString"
/MickeSv:låt oss bygga en egen, Generell DB_mod-rutin... (Open source)
Märkligt, jag trodde det skulle bli mer action i den här tråden.
Finns det nån liknande rutin därute måntro? hur gör ni andra? Bygger ni en ny sida per gång?