04. oktober 2007 - 22:41Der 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...
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.
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?
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 :)
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 "?
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:
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).
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)... :)
Å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 :-)
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:
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
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!
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
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.