26. marts 2006 - 17:43Der er
32 kommentarer og 1 løsning
Sub rutine med update af flere poster
Hej eksperter
jeg sidder og udvikler et mindre administrations modul hvor jeg opbygger en side via nogle paragrafer. disse paragrafer bliver vist under hinanden med almindelige html udfyldt fra en Database.
det hele er bygget op via nogle sub rutiner som bliver kaldt ved brug af nogle almindelige submit knapper.
jeg har skrevet en sub rutine som skal update de paragrafer der er vist for den gældende side. det er ikke optimalt at update alle paragrafer, når det måske ikke er alle der er ændret, men det tager jeg ikke højde for nu.
Problemet er at når jeg forsøger at benytte en for each konstruktion kan jeg kun opdatere et felt af gangen, hvor mit mål er at kunne opdatere alle felter for den gældende post.
Håber I kan guide mig igennem hvordan dette skal bygges op.
Umiddelbart ville jeg mene du lettest kommer omkring identificeringen af de enkelte felter ifht. til den paragraf du retter data for, er at udvide feltet med paragraffens id. Det kan du f.eks. gøre således:
<% sub ShowList %> <form name="ShowItems" method="post" action="VisParagraph.asp"> <% Set oDB = Server.CreateObject("ADODB.connection") oDB.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../../../db/CMSText.mdb") Set oRS = oDB.execute("SELECT * FROM [Paragraphs] WHERE ID ="& strPageID &" ORDER BY PaSort") Set oRS2 = oDB.execute("SELECT Titel FROM [Pages] WHERE AutoID = "& strPageID &"") response.write "<font face=Arial size=5>" & oRS2("Titel") & "</B></font><br> " Set oRS2 = NOTHING
do while not oRS.EOF %> <fieldset><legend><font color="#FF08FF"><%= oRS("OverSkr") %></font></legend> <input type=hidden name="hidSubmitted" value="<%= oRS("AutoID") %>"> <font face="Arial" size="2"> Titel på afsnit:<br> <input type="text" name="txtOverSkr<%= oRS("AutoID") %>" value="<%= oRS("OverSkr") %>"><br> Brødtekst til afsnitet:<br> <textarea name="txtBeskr<%= oRS("AutoID") %>" rows="4"><%= oRS("Beskr") %></textarea><br> Billede ved afsnittet start: <br> <%
Dim strFileName, strPhysPath Dim objFileFSO Dim objFileTS
Dim FileSystemObject, Folder, FileCollection, File Dim FolderPath
Server.ScriptTimeOut=1 FolderPath= Server.Mappath("../../images/") Set FileSystemObject = CreateObject("Scripting.FileSystemObject") 'List All Files Set Folder = FileSystemObject.GetFolder(Folderpath) Set FileCollection = Folder.Files %> <select size="1" name="txtbillede<%= oRS("AutoID") %>"> <option></option> <% For Each File In FileCollection If ucase(Right(File.name,4))=".GIF" or ucase(Right(File.name,4))=".JPG" Then TheFile = File.name if oRS("Billede") = TheFile then response.write "<option value=" & chr(34) & thefile & chr(34) & " selected>" & TheFile & "</option>" & vbcrlf else response.write "<option value=" & chr(34) & thefile & chr(34) & ">" & TheFile & "</option>" & vbcrlf end if Else End If Next %> </select>
<br>Justering: <select name="txtAlignment<%= oRS("AutoID") %>" size="1"> <option></option> <option value="Left" <% if oRS("Alignment") = "Left" then Response.Write " SELECTED" %>>Venstre</option> <option value="Right" <% if oRS("Alignment") = "Right" then Response.Write " SELECTED" %>>Højre</option> </select>
<% oRS.Movenext Loop oDB.Close set oRS = Nothing %> <input type="submit" value="delete" name="action"> <input type="submit" value="update" name="action"> </form> <% end sub %>
Og så skal din serverkode spørge i form-collection i stedet for querystring (fordi jeg har ændret method til POST, da du potentielt set skal sende mange data til serveren).
Jeg vil i øvrigt foreslå at du benytter dig af et Command-objekt da du så slipper for at tænke i sikring mod SQL-injection, herunder apostroffer i tekstfelterne, samt datoformater. Det kan gøres således:
' Forbered Command-objekt set cmd = Server.CreateObject("ADODB.Command") set cmd.ActiveConnection = oDB cmd.CommandType = adCmdText cmd.CommandText = sql
' Gennemløb alle feltgrupper og opdater indholdet i databasen For Each Item In Request.Form("hidSubmitted") ' Overfør parametre til Command-objektet cmd(0) = Request.Form("txtOverskr" & Item) cmd(1) = Request.Form("txtBeskr" & Item) cmd(2) = Request.Form("txtPaSort" & Item) cmd(3) = Request.Form("txtBillede" & Item) cmd(4) = Request.Form("txtAlignment" & Item) cmd(5) = Request.Form("hidSubmitted") cmd.Execute(strSQL) response.write " = " & request.Form("hidSubmitted") next
oDB.Close set cmd = Nothing end sub %>
og så skal du lige indsætte denne linie i toppen af den fil hvor du har brug for ADO-konstanterne, for ellers får du sikkert en fejl når du forsøger at køre koden:
jeg får en fejl i update statementet, hvis jeg tillægge Item til felt navne og update statementet. fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (comma) in query expression 'AutoID=4, 6'.
/admin/cms/VisParagraph.asp, line 193
fejlen ligger i eksekvering af min update
hr du nogle forslag, jeg har også prøvet med din command version, der for jeg en anden fejl, men jeg vil i første omgang gerne have at det virker på min måde, så vil jeg meget gerne sætte mig ind i din måde at gøre det på, den er meget spændende :)
Du kalder alle id-felterne for hidSubmitted og de vil derfor ligge i form-collection som en kommasepareret liste af id'er. Derfor splitter jeg dem op (og lægger dem i et array) med Split-funktionen, hvorefter jeg gennemløber alle id'erne hver for sig og hente data ud fra de pågældende felter.
<% sub ShowList (strPageID)%> <form name="ShowItems" method="post" action="VisParagraph.asp"> <% Set oDB = Server.CreateObject("ADODB.connection") oDB.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../../../db/CMSText.mdb") Set oRS = oDB.execute("SELECT * FROM [Paragraphs] WHERE ID ="& strPageID &" ORDER BY PaSort") Set oRS2 = oDB.execute("SELECT Titel FROM [Pages] WHERE AutoID = "& strPageID &"") response.write "<font face=Arial size=5>" & oRS2("Titel") & "</B></font><br> " Set oRS2 = NOTHING
do while not oRS.EOF %> <fieldset><legend><font color="#FF08FF"><%= oRS("OverSkr") %></font></legend> <input type=hidden name="hidSubmitted" value="<%= oRS("AutoID") %>"> <font face="Arial" size="2"> Titel på afsnit:<br> <input type="text" name="txtOverSkr<%= oRS("AutoID") %>" value="<%= oRS("OverSkr") %>"><br> Brødtekst til afsnitet:<br> <textarea name="txtBeskr<%= oRS("AutoID") %>" rows="4"><%= oRS("Beskr") %></textarea><br> Billede ved afsnittet start: <br> <%
Dim strFileName, strPhysPath Dim objFileFSO Dim objFileTS
Dim FileSystemObject, Folder, FileCollection, File Dim FolderPath
Server.ScriptTimeOut=1 FolderPath= Server.Mappath("../../images/") Set FileSystemObject = CreateObject("Scripting.FileSystemObject") 'List All Files Set Folder = FileSystemObject.GetFolder(Folderpath) Set FileCollection = Folder.Files %> <select size="1" name="txtbillede<%= oRS("AutoID") %>"> <option></option> <% For Each File In FileCollection If ucase(Right(File.name,4))=".GIF" or ucase(Right(File.name,4))=".JPG" Then TheFile = File.name if oRS("Billede") = TheFile then response.write "<option value=" & chr(34) & thefile & chr(34) & " selected>" & TheFile & "</option>" & vbcrlf else response.write "<option value=" & chr(34) & thefile & chr(34) & ">" & TheFile & "</option>" & vbcrlf end if Else End If Next %> </select>
<br>Justering: <select name="txtAlignment<%= oRS("AutoID") %>" size="1"> <option></option> <option value="Left" <% if oRS("Alignment") = "Left" then Response.Write " SELECTED" %>>Venstre</option> <option value="Right" <% if oRS("Alignment") = "Right" then Response.Write " SELECTED" %>>Højre</option> </select>
endnu engang må jeg vente til i aften, med at teste, jeg har ikke mulighed for at uploade noet fra min arbejdsplads, desværre. ked af at det er så besværligt.
det stemmer i databasen - næsten - jeg har ændre SaSort så der ikke er qouts omkring da det er et nummerisk felt. men fejlen er den samme, det som er underligt er at den opdatere den første record fint, men det er den 2. record som går galt??? de er ens på nær indhold af felterne. min Update SQL ser nu således ud:
Tillader alle felterne i databasen at du indsætter tomme strenge? og idet du har ændret PaSort til at være et tal, skal der jo også være validering på om feltet rent faktisk indeholder en numerisk værdi, for ellers fejler den på f.eks. tomme felter for txtPaSort...
Prøv lige denne kode i stedet for den nuværende løkke (jeg tror det er fordi der er kommet et mellemrum ind foran 6-tallet og det skal lige fjernes først, ellers passer feltnavnene jo ikke :)):
Jeg arbejder desværre alt for lidt i ASP.NET i øjeblikket, så det er lidt svært at holde fast i den viden jeg har fået opsamlet... men jeg kommer forhåbentlig til at arbejde med det igen snart :)
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.