Avatar billede ravnkilde Nybegynder
04. oktober 2007 - 22:41 Der er 18 kommentarer og
1 løsning

SQL update kode

Jeg har en side, der skal opdatere databasen efter brugeren har ændret sine tidligere indtastninger.

Brugerens data på siden (formular), hvor ændringerne laves er hentet med WHERE Participants.ParticipantID= "& Request.Querystring("ParticipantID")

Når brugeren submitter formularen, sendes data til en side, hvor jeg har nedenstående SQL-kode. I den kode har jeg brug for at få indsat brugerens ParticipantID. Noget med "WHERE...." i den første SQL til UPDATE participants formoder jeg...

Håber nogen gider hjælpe :-)

--- start kode ---

strSQL = "" &_
"UPDATE participants " &_
"(RegID, Firstname, Familyname, Function, Department, Country, Mobilephone, Email, Registrationdate) VALUES (" &_
"'7896','" & Request.Form("Firstname") & "','" & Request.Form("Familyname") & "','" & Request.Form("Function") & "','" & Request.Form("Department") & "','" & Request.Form("Country") & "','" & Request.Form("Mobilephone") & "','" & Request.Form("Email") & "', '"&Now&"') "
ObjConn.Execute(strSQL)

set rs = objConn.execute("select @@identity as thisID")
ID1 = rs("thisID")

strSQL = "" &_
"UPDATE ArrivalDetails " &_
"(ParticipantID, ArrivalDate, ArrivalMonth, ArrivalHour, ArrivalMinute, ArrivalBy, ArrivalFlightNo, TransferToHotel) VALUES (" &_
""& ID1 &",'" & Request.Form("ArrivalDate") & "','" & Request.Form("ArrivalMonth") &"','" & Request.Form("ArrivalHour") &"','" & Request.Form("ArrivalMinute") &"','" & Request.Form("ArrivalBy") &"','" & Request.Form("ArrivalFlightNo") &"','" & Request.Form("TransferToHotel") &"') "
ObjConn.Execute(strSQL)

strSQL = "" &_
"UPDATE DepartureDetails " &_
"(ParticipantID, DepartureDate, DepartureMonth, DepartureHour, DepartureMinute, DepartureBy, DepartureFlightNo, TransferToAirport) VALUES (" &_
"" & ID1 & ",'" & Request.Form("DepartureDate") & "','" & Request.Form("DepartureMonth") &"','" & Request.Form("DepartureHour") &"','" & Request.Form("DepartureMinute") &"','" & Request.Form("DepartureBy") &"','" & Request.Form("DepartureFlightNo") &"','" & Request.Form("TransferToAirport") &"') "
ObjConn.Execute(strSQL)

strSQL = "" &_
"UPDATE RoomReservation " &_
"(ParticipantID, RoomRequired, CheckinDate, CheckinMonth, CheckoutDate, CheckoutMonth, RoomPreference, DiateryRemarks, DiateryPreferences) VALUES (" &_
"" & ID1 & ",'" & Request.Form("RoomRequired") & "','" & Request.Form("CheckinDate") & "','" & Request.Form("CheckinMonth") &"','" & Request.Form("CheckoutDate") &"','" & Request.Form("CheckoutMonth") &"','" & Request.Form("RoomPreference") &"','" & Request.Form("DiateryRemarks") &"','" & Request.Form("DiateryPreferences") &"') "
ObjConn.Execute(strSQL)

--- stop kode ---
Avatar billede softspot Forsker
04. oktober 2007 - 22:52 #1
Der er flere emner som skal adresseres. Først og fremmest er formatet på en UPDATE:

UPDATE <tabel>
SET <feltnavn> = <feltværdi>
, <feltnavn> = <feltværdi>
WHERE <nøglefeltnavn> = <nøgleværdi>

hvor feltnavn er navnet på det felt i tabellen som skal tildeles en ny værdi og feltværdi er den værdi der skal lægges i feltet. Nøglefeltnavnet er i dit tilfælde ParticipantID og værdien er den du får med ind i QueryString.

Den anden ting som du skal være opmærksom på er at @@identity kun kan bruges i forbindelse med INSERT INTO og hvor du har en autonummereringskolonne som genererer et nyt ID i tabellen. Du kan altså ikke bruge den til en UPDATE.
Avatar billede ravnkilde Nybegynder
04. oktober 2007 - 22:54 #2
ups! Hvad gør jeg så, softspot? Har jeg handicappet mig selv ved at have flere tabeller i databasen (derfor identity). Hvordan laver jeg så en opdatering med dataerne fra den form-side, hvor brugeren retter?
Avatar billede softspot Forsker
04. oktober 2007 - 23:15 #3
Du gør i princippet det du har vist ovenfor, bare med den nye (rigtige) syntaks for UPDATE-sætningen. Det er ikke nødvendigt at opdatere ParticipentsID i nogle af tabellerne, da jeg går ud fra det er nøglen på de data der ændres (så det der hedder ID1 skal altså undlades). Jeg fornemmer du gerne vil have mig til at skrive koden fiks og færdig for dig, men det har jeg nu ikke tænkt mig. Jeg giver dig gerne et skub i den rigtige retning :)

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantsID")
objConn.Execute strSQL

Recepten er den samme for alle opdateringerne, så det er bare med at komme i sving ;-D
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 11:13 #4
hej softspot! Tak! Jeg har fået transporteret ParticipantsID over og jeg er nu ved at kode resten af opdateringskode selv ;-), men får fejlen:
Expected end of statement
editupdate.asp, line 18
"Registrationdate = '" & Replace("&Now&")"' " & _
-----------------------------------------^

Jeg har tydeligvis ikke helt styr på '"'erne. Jeg tror heller ikke linien med WHERE er helt OK - mangler der et "?

--- kode start ---

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Department = '" & Replace(Request.Form("Department"),"'","''") & "' " & _
  "Country = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Mobilephone = '" & Replace(Request.Form("Mobilephone"),"'","''") & "' " & _
  "Email = '" & Replace(Request.Form("Email"),"'","''") & "' " & _
  "Registrationdate = '" & Replace("&Now&")"' " & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantsID")
objConn.Execute strSQL

--- kode stop ---
Avatar billede softspot Forsker
05. oktober 2007 - 13:25 #5
Alt efter hvilken database der er tale om, kan du med fordel benytte databasens indbyggede funktioner til at finde bla. dato'er med. I MS Access hedder funktionen som i VBScript now() og i MS SQL Server hedder den getdate(). På den måde kommer du heller ikke til at ligge og rode med forskelle i datoformater under forskellige regional settings på den pågældende server.

Derfor vil det i Access komme til at se således ud:

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Department = '" & Replace(Request.Form("Department"),"'","''") & "' " & _
  "Country = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Mobilephone = '" & Replace(Request.Form("Mobilephone"),"'","''") & "' " & _
  "Email = '" & Replace(Request.Form("Email"),"'","''") & "', " & _
  "Registrationdate = Now() " & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantsID")
objConn.Execute strSQL

Hvis du ikke lige kan bruge now i den givne opdatering (f.eks. hvis datoen er et input fra brugeren), så skal du i MS Access sørge for at bruge # omkring din dato (hvis feltet altså er af typen dato/tid i databasen). I SQL Server og vist nok også MySQL er det i strengformatet (altså med apostroffer omkring datoen).

Eksempelvis således i Access:

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Department = '" & Replace(Request.Form("Department"),"'","''") & "' " & _
  "Country = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Mobilephone = '" & Replace(Request.Form("Mobilephone"),"'","''") & "' " & _
  "Email = '" & Replace(Request.Form("Email"),"'","''") & "', " & _
  "Registrationdate = #' & Now() "# & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantsID")
objConn.Execute strSQL

og sådan i SQL Server (og sikkert også MySQL):

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Department = '" & Replace(Request.Form("Department"),"'","''") & "' " & _
  "Country = '" & Replace(Request.Form("Function"),"'","''") & "' " & _
  "Mobilephone = '" & Replace(Request.Form("Mobilephone"),"'","''") & "' " & _
  "Email = '" & Replace(Request.Form("Email"),"'","''") & "', " & _
  "Registrationdate = '" & Now & "' & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantsID")
objConn.Execute strSQL

Jeg er ikke klar over hvad MySQL's indbyggede datofunktion hedder, men et kvalificeret gæt ville da være getdate() som i SQL Server... :)
Avatar billede softspot Forsker
05. oktober 2007 - 13:34 #6
Og lige for at afklare hvorfor jeg skrev f.eks.

  Replace(Request.Form("Email"),"'","''")

det er for at undgå evt. apostroffer i de tekster du indsætter "ødelægger" det for databasen. Eksempelvis vil en apostrof i emailadressen ovenfor, uden replace-konstruktionen, bevirke at databasen opfattede strengværdien der skulle tildeles feltet email, som afsluttet. Det er jo ikke er tilfældet, derfor vil det så, med stor sandsynlighed, resulterer i en forkert SQL-syntaks.

Onde brugere ville kunne udnytte denne fejl til at skaffe sig adgang til dine data, eller slette løs efter forgodtbefindende (også kaldet SQL-injections).

Derfor er det også meget bedre at bruge ADODB.Command og parametre i stedet for sammensatte SQL-strenge når der arbejdes med databaser, da Command og parametre sikrer, at data bliver formidlet som de typer de nu engang har i databasen (og strenge må gerne indeholde både anførselstegn og apostroffer :)). Og så bliver koden også lidt mindre kryptisk at se på (min personlige holdning)... :)
Avatar billede softspot Forsker
05. oktober 2007 - 13:39 #7
Åh ja, jeg kan se der mangler komma'er mellem de enkelte felter i din SQL (og det er jeg så kommet til at kopiere med over i mine eksempler, fordi jeg ikke kiggede ordentlig efter :-)

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "', " & _
  "Department = '" & Replace(Request.Form("Department"),"'","''") & "', " & _
  "Country = '" & Replace(Request.Form("Function"),"'","''") & "', " & _
  "Mobilephone = '" & Replace(Request.Form("Mobilephone"),"'","''") & "', " & _
  "Email = '" & Replace(Request.Form("Email"),"'","''") & "', " & _
  "Registrationdate = '" & Now & "' & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantsID")
objConn.Execute strSQL
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 13:47 #8
Godt du er tilbage, softspot!

Din kode giver flg. fejl:
Microsoft VBScript compilation error '800a0409'

Unterminated string constant
editupdate.asp, line 18
"Registrationdate = '" & Now & "' & _
-------------------------------------^

Alle felter i Access databasen er af typen tekst (undtaget ParticipantID, der er autonr.)

Skal Registrationdate ikke replace?, selvom den hentes fra serveren, og "ikke fra brugerens indtastning i formen"?
Avatar billede softspot Forsker
05. oktober 2007 - 13:54 #9
Nej, den skal ikke replaces, men jeg er usikker på om du kan bruge now til et tekstfelt. Jeg vil under alle omstændigheder anbefale dig at bruge den korrekte felttype til det enkelte felt, da databasen så har lettere ved at optimere pladsforbrug og forspørgsler til felternes faktiske indhold. Du skal umiddelbart bruge den første udgave af de SQL-sætninger jeg viste:

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "', " & _
  "Department = '" & Replace(Request.Form("Department"),"'","''") & "', " & _
  "Country = '" & Replace(Request.Form("Function"),"'","''") & "', " & _
  "Mobilephone = '" & Replace(Request.Form("Mobilephone"),"'","''") & "', " & _
  "Email = '" & Replace(Request.Form("Email"),"'","''") & "', " & _
  "Registrationdate = Now() " & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantsID")
objConn.Execute strSQL
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 13:55 #10
softspot: Jeg tog den forkerte dato-linie! Se nedenfor (men er fortsat uden replace - OK?).

Nedenstående kode giver denne fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
editupdate.asp, line 20



--- start kode ---

strSQL = "" & _
  "UPDATE participants " &_
  "SET RegID = '7896', " & _
  "Firstname = '" & Replace(Request.Form("Firstname"),"'","''") & "', " & _
  "Familyname = '" & Replace(Request.Form("Familyname"),"'","''") & "', " & _
  "Function = '" & Replace(Request.Form("Function"),"'","''") & "', " & _
  "Department = '" & Replace(Request.Form("Department"),"'","''") & "', " & _
  "Country = '" & Replace(Request.Form("Country"),"'","''") & "', " & _
  "Mobilephone = '" & Replace(Request.Form("Mobilephone"),"'","''") & "', " & _
  "Email = '" & Replace(Request.Form("Email"),"'","''") & "', " & _
  "Registrationdate = Now() " & _
  "WHERE ParticipantsID = " & Request.QueryString("ParticipantID")
objConn.Execute strSQL

--- stop kode ---
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 13:57 #11
ad dato Now i Access med tekstfelt: Det virker fint, i hvert fald første gang data på brugeren skrives ned.
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 14:00 #12
jeg fandt fejlen (skulle være WHERE Participant(s)ID (uden s)!

sådan ser sql'en skrevet ud:
UPDATE participants SET RegID = '7896', Firstname = 'Hans', Familyname = 'Larsen', Function = 'CEO', Department = 'IT', Country = 'DK', Mobilephone = '+45 8899', Email = 'cra@mail.dk', Registrationdate = Now() WHERE ParticipantID = 172

Men i stedet for Now skulle den aktuelle dato have været der!
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 14:13 #13
den skal være: "Registrationdate = '"&Now&"' " & _
Avatar billede softspot Forsker
05. oktober 2007 - 14:15 #14
now er som sagt en indbygget funktion i databasen og den vil blive indsat når du udfører din update...
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 14:37 #15
Første tabel opdateret! Tak for hjælpen, softspot. Nu kommer turen til de øvrige tre, der bruges sammen med den første.

Jeg har kopieret din recept, men (!) jeg får syntax fejl igen på min SQL:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement.
editupdate.asp, line 35

Hvad er det jeg kikser igen???

--- kode start ---

Arrival table
strSQL = "" & _
  "UPDATE ArrivalDetails SET " &_
  "ArrivalDate = '" & Replace(Request.Form("ArrivalDate"),"'","''") & "', " & _
  "ArrivalMonth = '" & Replace(Request.Form("ArrivalMonth"),"'","''") & "', " & _
  "ArrivalHour = '" & Replace(Request.Form("ArrivalHour"),"'","''") & "', " & _
  "ArrivalMinute = '" & Replace(Request.Form("ArrivalMinute"),"'","''") & "', " & _
  "ArrivalBy = '" & Replace(Request.Form("ArrivalBy"),"'","''") & "', " & _
  "ArrivalFlightNo = '" & Replace(Request.Form("ArrivalFlightNo"),"'","''") & "', " & _
  "TransferToHotel = '" & Replace(Request.Form("TransferToHotel"),"'","''") & "', " & _
  "WHERE ParticipantID = " & Request.QueryString("ParticipantID")
objConn.Execute strSQL

--- kode stop ---

Alle felter i denne tabel er sat til tekst, trods dato kommer ind som tal.
Avatar billede softspot Forsker
05. oktober 2007 - 14:58 #16
Det sidste felt skal ikke efterstilles af komma:

  "TransferToHotel = '" & Replace(Request.Form("TransferToHotel"),"'","''") & "', " & _

den linie skal rettes til:

  "TransferToHotel = '" & Replace(Request.Form("TransferToHotel"),"'","''") & "' " & _
Avatar billede ravnkilde Nybegynder
05. oktober 2007 - 15:07 #17
du er gud! Smid et svar og få dig nogle velfortjente points! PS: God forklaring omkring replace. God weekend. Jeg knokler videre...
Avatar billede softspot Forsker
05. oktober 2007 - 15:11 #18
Velbekomme og ligeledes god weekend til dig! :)
Avatar billede softspot Forsker
05. oktober 2007 - 15:28 #19
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester