Avatar billede hinkesten Praktikant
12. marts 2011 - 00:40 Der er 22 kommentarer og
1 løsning

ASP: Update access db fejl

Hej

Jeg får flg. fejl når jeg prøver at opdatere records i min access database.

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

/login/sites/rediger_medarbejder.asp, line 27

Min kode er som flg.:

...

Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("db.mdb")
Conn.Open DSN

strSQL = "UPDATE medlemmer set "
strSQL = strSQL & navn = "'" & Request.Form("navn") & "',"
strSQL = strSQL & stilling = "'" & Request.Form("stilling") & "',"
strSQL = strSQL & titel = "'" & Request.Form("titel") & "',"
strSQL = strSQL & uddannet = "'" & Request.Form("uddannet") & "',"
strSQL = strSQL & arbejdsopgaver = "'" & Request.Form("arbejdsopgaver") & "',"
strSQL = strSQL & billede = "'" & Request.Form("billede") & "',"
strSQL = strSQL & mail = "'" & Request.Form("mail") & "',"
strSQL = strSQL & " Where Id = " & request.querystring("id")

Conn.Execute(strSQL)
Conn.Close
Set Conn = Nothing

Linie 27 er denne linie:
Conn.Execute(strSQL)

Nogen idé til hvad går galt?
Avatar billede keysersoze Guru
12. marts 2011 - 00:43 #1
ovenstående er, bortset fra UPDATE syntaks til INSERT - en UPDATE statement ser således ud;

UPDATE tabel SET (col1, col2) VALUES ('val1', 'val2') WHERE id = 1

Husk også at tage højde for SQL injections; http://www.web-dev.dk/post/SQL-injections-mere-end-bare-et-pling.aspx
Avatar billede arne_v Ekspert
12. marts 2011 - 03:34 #2
WTF????
Avatar billede keysersoze Guru
12. marts 2011 - 10:06 #3
Sorry - det er selvfølgelig absolut forkert! Må have været ramt af en momentan hjerneblødning i nat :)

Dine linjer skal i stedet skrives således;

strSQL = strSQL & "navn = '" & Request.Form("navn") & "',"

Men problemet med SQL Injection skal der nu stadig tages hensyn til.
Avatar billede claes57 Ekspert
12. marts 2011 - 11:03 #4
der er et komma for meget - ret
strSQL = strSQL & mail = "'" & Request.Form("mail") & "',"
strSQL = strSQL & " Where Id = " & request.querystring("id")

til
strSQL = strSQL & mail = "'" & Request.Form("mail") & "'"
strSQL = strSQL & " Where Id = " & request.querystring("id")
Avatar billede hinkesten Praktikant
12. marts 2011 - 11:13 #5
#1 + #3

Jeg har prøvet at løse det nu, men uden held. Jeg har jo defineret at den skal opdatere indhold i ID = request.querystring("id") i nederste strSQL linie. Er dette ikke nok?

Kan ikke finde fejlen :/

#2 ??

#4 Det er rettet nu, kan egentlig godt se at der var et komma for meget, men jeg får samme fejl.
Avatar billede claes57 Ekspert
12. marts 2011 - 11:19 #6
og du har ingen tomme felter i denne sql - i stil med den, jeg lavede om tidligere?
Ellers prøv at lave
Conn.Execute(strSQL)
om til
response.write strSQL
så kan du hurtigt se, om data er på plads.
Avatar billede keysersoze Guru
12. marts 2011 - 11:26 #7
kommentaren i 2# var til min kommentar #1 som var helt ude i skoven :)
Avatar billede hinkesten Praktikant
12. marts 2011 - 11:27 #8
Ingen tomme felter, nej.

Ved udskrivningen af strSQL får jeg faktisk samme fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

/login/sites/rediger_medarbejder.asp, line 27

Min kode lige nu er som flg.:


Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("../../../database/lsa.mdb")
Conn.Open DSN
   
strSQL = "Insert into medarbejdere ("
strfelt = ""
   
if Request.Form("navn") <> "" then strfelt = strfelt & "navn, "
if Request.Form("stilling") <> "" then strfelt = strfelt & "stilling, "
if Request.Form("titel") <> "" then strfelt = strfelt & "titel, "
if Request.Form("uddannet") <> "" then strfelt = strfelt & "uddannet, "
if Request.Form("arbejdsopgaver") <> "" then strfelt = strfelt & "arbejdsopgaver, "
if Request.Form("billede") <> "" then strfelt = strfelt & "billede, "
if Request.Form("mail") <> "" then strfelt = strfelt & "mail, "
   
' fjern sidste " ,"
strfelt = trim(strfelt)
strfelt = left(strfelt,len(strfelt)-1)
strSQL = strSQL & strfelt
strSQL = strSQL & ") values("
strfelt = ""
   
if Request.Form("navn") <> "" then strfelt = strfelt & "'" & Request.Form("navn") & "',"
if Request.Form("stilling") <> "" then strfelt = strfelt & "'" & Request.Form("stilling") & "',"
if Request.Form("titel") <> "" then strfelt = strfelt & "'" & Request.Form("titel") & "',"
if Request.Form("uddannet") <> "" then strfelt = strfelt & "'" & Request.Form("uddannet") & "',"
if Request.Form("arbejdsopgaver") <> "" then strfelt = strfelt & "'" & Request.Form("arbejdsopgaver") & "',"
if Request.Form("billede") <> "" then strfelt = strfelt & "'" & Request.Form("billede") & "',"
if Request.Form("mail") <> "" then strfelt = strfelt & "'" & Request.Form("mail") & "',"
   
strfelt = left(strfelt,len(strfelt)-1)
strSQL = strSQL & strfelt & ")"
response.write strSQL
   
Conn.Close
Set Conn = Nothing


Linie 27:
strfelt = left(strfelt,len(strfelt)-1)
Avatar billede keysersoze Guru
12. marts 2011 - 11:33 #9
Husk at se bort fra min kommentar i #1 - når du laver en response.write skal du ikke execute din SQL.
Avatar billede claes57 Ekspert
12. marts 2011 - 12:06 #10
vedr 'update' så kalder du tabellen
strSQL = "UPDATE medlemmer set "

men i den med insert
strSQL = "Insert into medarbejdere ("
Avatar billede hinkesten Praktikant
12. marts 2011 - 22:53 #11
Hov, beklager - jeg er vist kommet til at paste min kode fra det spørgsmål du hjalp med før claes57 - derfor insert

Koden er som flg:


Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("database.mdb")
Conn.Open DSN

strSQL = "Insert into medlemmer ("
strSQL = strSQL & navn = "'" & Request.Form("navn") & "',"
strSQL = strSQL & stilling = "'" & Request.Form("stilling") & "',"
strSQL = strSQL & titel = "'" & Request.Form("titel") & "',"
strSQL = strSQL & uddannet = "'" & Request.Form("uddannet") & "',"
strSQL = strSQL & arbejdsopgaver = "'" & Request.Form("arbejdsopgaver") & "',"
strSQL = strSQL & billede = "'" & Request.Form("billede") & "',"
strSQL = strSQL & mail = "'" & Request.Form("mail") & "'"
strSQL = strSQL & " Where Id = " & request.querystring("id")

Conn.Execute(strSQL)

Conn.Close
Set Conn = Nothing
Avatar billede hinkesten Praktikant
12. marts 2011 - 22:53 #12
og får samme fejl i linie 27 (Conn.Execute(strSQL))

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

/login/sites/rediger_medarbejder.asp, line 27
Avatar billede hinkesten Praktikant
12. marts 2011 - 22:55 #13
Kl er vist for mange til mig. Beklager forvirringen.

Denne sætning bruger jeg IKKE:
strSQL = "Insert into medlemmer ("

men i stedet denne:
strSQL = "UPDATE medarbejdere set"

og får altså samme fejl som skrevet i ovenstående indlæg
Avatar billede keysersoze Guru
12. marts 2011 - 23:39 #14
du har ikke ændret det jeg foreslog i #3 - nogle af dine " er sat forkert, det skal ændres til

strSQL = strSQL & "navn = '" & Request.Form("navn") & "',"

på alle dine linjer. Og husk stadig SQL Injection.
Avatar billede hinkesten Praktikant
13. marts 2011 - 00:41 #15
Jeg må tilstå at jeg ikke forstår det til fulde

UPDATE tabel SET (col1, col2) VALUES ('val1', 'val2') WHERE id = 1

skal jeg her nævne id igen? jeg nævner det jo også til sidst i sql strengen?

dvs den skal hedde noget ala

UPDATE medlemmer SET (navn, titel, stilling) VALUES ('" & Request.Form("navn") & "'," '" & Request.Form("titel") & "'," '" & Request.Form("stilling") & "',")

?

er ret utroligt nok ret grøn på et halvgammelt emne her ;-(
Avatar billede claes57 Ekspert
13. marts 2011 - 08:22 #16
UPDATE medlemmer SET (navn, titel, stilling) VALUES ('" & Request.Form("navn") & "', '" & Request.Form("titel") & "', '" & Request.Form("stilling") & "')

jeg tror, du skal droppe at arbejde på projektet efter 22:00... ;)
Avatar billede keysersoze Guru
13. marts 2011 - 11:40 #17
Jeg tror lige at vi skal glemme mere eller mindre alt hvad der er skrevet i tråden indtil nu - som skrevet en del gange er alt skrevet i 1#, pånær SQL Injections, noget absolut sludder og de reele ting der er skrevet har du på mystisk vis overset. Derfor prøv med dette;

strSQL = "UPDATE medlemmer set "
strSQL = strSQL & "navn = '" & Request.Form("navn") & "', "
strSQL = strSQL & "stilling = '" & Request.Form("stilling") & "', "
strSQL = strSQL & "titel = '" & Request.Form("titel") & "', "
strSQL = strSQL & "uddannet = '" & Request.Form("uddannet") & "', "
strSQL = strSQL & "arbejdsopgaver = '" & Request.Form("arbejdsopgaver") & "', "
strSQL = strSQL & "billede = '" & Request.Form("billede") & "', "
strSQL = strSQL & "mail = '" & Request.Form("mail") & "', "
strSQL = strSQL & " Where Id = " & request.querystring("id")

Hvis det ikke fungere så skriv

Response.Write strSQL
Response.End

umiddelbart før din Conn.Execute(strSQL) og giv os resultatet af det. Fungerer det kan jeg igen kun henvise til artiklen omkring SQL Injections da dit system ellers bliver hullet som en si.
Avatar billede claes57 Ekspert
13. marts 2011 - 12:26 #18
og så tjek lige tabel-navnet, og uden komma i #17 linjen
strSQL = strSQL & "mail = '" & Request.Form("mail") & "', "
som skal være
strSQL = strSQL & "mail = '" & Request.Form("mail") & "'"
Avatar billede hinkesten Praktikant
13. marts 2011 - 12:27 #19
Okay. Det havde jeg nu også prøvet med, men uden held.

Får samme fejl som hidtil beskrevet.

Ved udskrivningen af SQL strengen får jeg flg. værdier:

UPDATE medarbejdere set navn = 'Dennis', stilling = 'x', titel = 'x', uddannet = '01-01-2005', arbejdsopgaver = 'bla,bla,bla', billede = 'dennis', mail = 'mail@mail.dk', Where Id = 1

Det ser vel ok ud?
Avatar billede hinkesten Praktikant
13. marts 2011 - 12:42 #20
Det skal lige siges at tabellen er ændret til at hedde medarbejdere og ikke medlemmer - hvis du undrer dig over dette
Avatar billede claes57 Ekspert
13. marts 2011 - 12:44 #21
så lige kommaet før Where
....il@mail.dk', Where Id = 1
Avatar billede hinkesten Praktikant
13. marts 2011 - 13:10 #22
Doh! Tusind tak. Vil du lave et svar?
Avatar billede hinkesten Praktikant
13. marts 2011 - 13:26 #23
løst af claes57 men vil ikke have points
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