Avatar billede ravnkilde Nybegynder
09. marts 2006 - 13:44 Der er 30 kommentarer og
2 løsninger

Data type mismatch in criteria expression - formular til database

Hej!

Jeg har en database med felterne: Entry (dato), GameID (auto), Q1 til Q63 (tal).

Når jeg forsøger at skrive formularens data til databasen v.h.a. nedenstående kode, fås fejlmeddelelsen "Data type mismatch in criteria expression".

Jeg synes jeg har checket databasen for korrekt felttype og formularen samt script til indsættelse i databsen, men kan simpelthen ikke finde fejlen. Venligst hjælp!


--- start kode ---

<%
'Definer variabler
Dim sConnString, connection, sSQL, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23, Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31, Q32, Q33, Q34, Q35, Q36, Q37, Q38, Q39, Q40, Q41, Q42, Q43, Q44, Q45, Q46, Q47, Q48, Q49, Q50, Q51, Q52, Q53, Q54, Q55, Q56, Q57, Q58, Q59, Q60, Q61, Q62, Q63

'Hent data fra formular
Q1 = Request.Form("Q1")
Q2 = Request.Form("Q2")
Q3 = Request.Form("Q3")
Q4 = Request.Form("Q4")
Q5 = Request.Form("Q5")
Q6 = Request.Form("Q6")
Q7 = Request.Form("Q7")
Q8 = Request.Form("Q8")
Q9 = Request.Form("Q9")
Q10 = Request.Form("Q10")
Q11 = Request.Form("Q11")
Q12 = Request.Form("Q12")
Q13 = Request.Form("Q13")
Q14 = Request.Form("Q14")
Q15 = Request.Form("Q15")
Q16 = Request.Form("Q16")
Q17 = Request.Form("Q17")
Q18 = Request.Form("Q18")
Q19 = Request.Form("Q19")
Q20 = Request.Form("Q20")
Q21 = Request.Form("Q21")
Q22 = Request.Form("Q22")
Q23 = Request.Form("Q23")
Q24 = Request.Form("Q24")
Q25 = Request.Form("Q25")
Q26 = Request.Form("Q26")
Q27 = Request.Form("Q27")
Q28 = Request.Form("Q28")
Q29 = Request.Form("Q29")
Q30 = Request.Form("Q30")
Q31 = Request.Form("Q31")
Q32 = Request.Form("Q32")
Q33 = Request.Form("Q33")
Q34 = Request.Form("Q34")
Q35 = Request.Form("Q35")
Q36 = Request.Form("Q36")
Q37 = Request.Form("Q37")
Q38 = Request.Form("Q38")
Q39 = Request.Form("Q39")
Q40 = Request.Form("Q40")
Q41 = Request.Form("Q41")
Q42 = Request.Form("Q42")
Q43 = Request.Form("Q43")
Q44 = Request.Form("Q44")
Q45 = Request.Form("Q45")
Q46 = Request.Form("Q46")
Q47 = Request.Form("Q47")
Q48 = Request.Form("Q48")
Q49 = Request.Form("Q49")
Q50 = Request.Form("Q50")
Q51 = Request.Form("Q51")
Q52 = Request.Form("Q52")
Q53 = Request.Form("Q53")
Q54 = Request.Form("Q54")
Q55 = Request.Form("Q55")
Q56 = Request.Form("Q56")
Q57 = Request.Form("Q57")
Q58 = Request.Form("Q58")
Q59 = Request.Form("Q59")
Q60 = Request.Form("Q60")
Q61 = Request.Form("Q61")
Q62 = Request.Form("Q62")
Q63 = Request.Form("Q63")

'Definer SQL
sSQL = "INSERT into Games (Entry, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23, Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31, Q32, Q33, Q34, Q35, Q36, Q37, Q38, Q39, Q40, Q41, Q42, Q43, Q44, Q45, Q46, Q47, Q48, Q49, Q50, Q51, Q52, Q53, Q54, Q55, Q56, Q57, Q58, Q59, Q60, Q61, Q62, Q63) values ('" & Now() &"', '" & Q1 & "', '" & Q2 & "', '" & Q3 & "', '" & Q4 & "', '" & Q5 & "', '" & Q6 & "', '" & Q7 & "' , '" & Q8 & "', '" & Q9 & "', '" & Q10 & "', '" & Q11 & "', '" & Q12 & "', '" & Q13 & "', '" & Q14 & "', '" & Q15 & "', '" & Q16 & "', '" & Q17 & "', '" & Q18 & "', '" & Q19 & "', '" & Q20 & "', '" & Q21 & "', '" & Q22 & "', '" & Q23 & "', '" & Q24 & "', '" & Q25 & "', '" & Q26 & "', '" & Q27 & "', '" & Q28 & "', '" & Q29 & "', '" & Q30 & "', '" & Q31 & "', '" & Q32 & "', '" & Q33 & "', '" & Q34 & "', '" & Q35 & "', '" & Q36 & "', '" & Q37 & "', '" & Q38 & "', '" & Q39 & "', '" & Q40 & "', '" & Q41 & "', '" & Q42 & "', '" & Q43 & "', '" & Q44 & "', '" & Q45 & "', '" & Q46 & "', '" & Q47 & "', '" & Q48 & "', '" & Q49 & "', '" & Q50 & "', '" & Q51 & "', '" & Q52 & "', '" & Q53 & "', '" & Q54 & "', '" & Q55 & "', '" & Q56 & "', '" & Q57 & "', '" & Q58 & "', '" & Q59 & "', '" & Q60 & "', '" & Q61 & "', '" & Q62 & "', '" & Q63 & "')"

--- kode slut ---
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 13:47 #1
Tilføjelse: Q58 til Q63 er tekstfelter og får værdierne "ja" eller "nej" fra formularen. Q1 til Q57 er alle tal og får værdierne fra "1-5".
Avatar billede eagleeye Praktikant
09. marts 2006 - 13:52 #2
Bruger du Access? Så skal der ikke ' omkring tallene du indsætter i SQL sætningen. Så fra Q1 til Q57 skal der ikke ' omkring:

values ('" & Now() &"', '" & Q1 & "', '" & Q2 & "', ............

Skal være:

values ('" & Now() &"', " & Q1 & ", " & Q2 & ", ............
Avatar billede softspot Forsker
09. marts 2006 - 13:53 #3
Talfelter skal ikke omstilles med apostroffer. Datoen skal omstilles af # i stedet for apostroffer.

Jeg vil i øvrigt anbefale en løkke til at generere din SQL-sætning, da det forventeligt bliver lidt mindre omfattende.

Optimalt set burde du nok lave en relation til en anden tabel som indeholdt svarene, men jeg kan ikke helt gennemskue hvilken idé din database er opbygget om...
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 14:10 #4
Med en rettet kode fås nu denne fejlmeddelelse: Syntax error in INSERT INTO statement.

--- rettet kode ---

sSQL = "INSERT into Games (Entry, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23, Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31, Q32, Q33, Q34, Q35, Q36, Q37, Q38, Q39, Q40, Q41, Q42, Q43, Q44, Q45, Q46, Q47, Q48, Q49, Q50, Q51, Q52, Q53, Q54, Q55, Q56, Q57, Q58, Q59, Q60, Q61, Q62, Q63) values ('" & Now() & "', " & Q1 & ", " & Q2 & ", " & Q3 & ", " & Q4 & ", " & Q5 & ", " & Q6 & ", " & Q7 & ", " & Q8 & ", " & Q9 & ", " & Q10 & ", " & Q11 & ", " & Q12 & ", " & Q13 & ", " & Q14 & ", " & Q15 & ", " & Q16 & ", " & Q17 & ", " & Q18 & ", " & Q19 & ", " & Q20 & ", " & Q21 & ", " & Q22 & ", " & Q23 & ", " & Q24 & ", " & Q25 & ", " & Q26 & ", " & Q27 & ", " & Q28 & ", " & Q29 & ", " & Q30 & ", " & Q31 & ", " & Q32 & ", " & Q33 & ", " & Q34 & ", " & Q35 & ", " & Q36 & ", " & Q37 & ", " & Q38 & ", " & Q39 & ", " & Q40 & ", " & Q41 & ", " & Q42 & ", " & Q43 & ", " & Q44 & ", " & Q45 & ", " & Q46 & ", " & Q47 & ", " & Q48 & ", " & Q49 & ", " & Q50 & ", " & Q51 & ", " & Q52 & ", " & Q53 & ", " & Q54 & ", " & Q55 & ", " & Q56 & ", " & Q57 & ", '" & Q58 & "', '" & Q59 & "', '" & Q60 & "', '" & Q61 & "', '" & Q62 & "', '" & Q63 & "')"

--- rettet kode slut ---
Avatar billede softspot Forsker
09. marts 2006 - 14:37 #5
Du kan faktisk bare bruge now-funktionen fra databasen, så er du ude over fejlkilden hvad angår formatering af dato:

sSQL = "INSERT INTO Games (Entry, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23, Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31, Q32, Q33, Q34, Q35, Q36, Q37, Q38, Q39, Q40, Q41, Q42, Q43, Q44, Q45, Q46, Q47, Q48, Q49, Q50, Q51, Q52, Q53, Q54, Q55, Q56, Q57, Q58, Q59, Q60, Q61, Q62, Q63) VALUES (Now(), " & Q1 & ", " & Q2 & ", " & Q3 & ", " & Q4 & ", " & Q5 & ", " & Q6 & ", " & Q7 & ", " & Q8 & ", " & Q9 & ", " & Q10 & ", " & Q11 & ", " & Q12 & ", " & Q13 & ", " & Q14 & ", " & Q15 & ", " & Q16 & ", " & Q17 & ", " & Q18 & ", " & Q19 & ", " & Q20 & ", " & Q21 & ", " & Q22 & ", " & Q23 & ", " & Q24 & ", " & Q25 & ", " & Q26 & ", " & Q27 & ", " & Q28 & ", " & Q29 & ", " & Q30 & ", " & Q31 & ", " & Q32 & ", " & Q33 & ", " & Q34 & ", " & Q35 & ", " & Q36 & ", " & Q37 & ", " & Q38 & ", " & Q39 & ", " & Q40 & ", " & Q41 & ", " & Q42 & ", " & Q43 & ", " & Q44 & ", " & Q45 & ", " & Q46 & ", " & Q47 & ", " & Q48 & ", " & Q49 & ", " & Q50 & ", " & Q51 & ", " & Q52 & ", " & Q53 & ", " & Q54 & ", " & Q55 & ", " & Q56 & ", " & Q57 & ", '" & Q58 & "', '" & Q59 & "', '" & Q60 & "', '" & Q61 & "', '" & Q62 & "', '" & Q63 & "')"
Avatar billede eagleeye Praktikant
09. marts 2006 - 14:38 #6
En god ide er at udkskrive del sSQL du bygger op så kan det være lettere at se evt fejl. Ting som man skal kigge efter er manglene , og for mange '. Eller parametre som er tomme.
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 14:43 #7
softspot: jeg har prøvet at bruge Now(), - men den siger fortsat: Syntax error in INSERT INTO statement.

Jeg ka' bare ikke finde fejlen.

PS: Du har ret med løkken og relationen, men projektet har udviklet sig fra en lille til en noget større ting, og tiden tillader ikke alt for store ændringer. Men du har ret.
Avatar billede softspot Forsker
09. marts 2006 - 14:49 #8
Jeg har lige checket alle Q'erne igennem og kan ikke se at der skulle mangle nogen apostroffer ifht. det du har sagt ang. datatyper, så kan det være at et af felterne ikke har den forventede datatype i databasen...?

...og som eagleeye siger, så prøv at udskrive SQL-sætningen... det er ofte lettere at se hvad der er galt når man ser selve SQL-sætningen i det format som databasen modtager den.
Avatar billede eagleeye Praktikant
09. marts 2006 - 14:58 #9
Noget som også kan drille er hvis der bruges reserverede ord som tabel- eller kolonnenavne men umiddbart er Games, Entry, eller Qx ikke reservede ord. Men hvis din SQL sætning ellers ser rigtig ud når du udskriver den så prøv at sætte klammer omkring afligevel:

sSQL = "INSERT INTO [Games] ([Entry], [Q1], [Q2], [Q3], [Q4], Q5, Q6, Q7, Q8, Q9, Q10, Q11

jeg har gså sat klammer omkring Q1 til Q4 fordi det på engelsk kan være en forkortelse for 1-4. kvartal i året.
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:10 #10
Med Response.Write Now() & " " & Q1 & Q2 & Q3 & Q4 & Q5 & Q6 & Q7 & Q8 & Q9 & Q10 & Q11 & Q12 & Q13 & Q14 & Q15 & Q16 & Q17 & Q18 & Q19 & Q20 & Q21 & Q22 & Q23 & Q24 & Q25 & Q26 & Q27 & Q28 & Q29 & Q30 & Q31 & Q32 & Q33 & Q34 & Q35 & Q36 & Q37 & Q38 & Q39 & Q40 & Q41 & Q42 & Q43 & Q44 & Q45 & Q46 & Q47 & Q48 & Q49 & Q50 & Q51 & Q52 & Q53 & Q54 & Q55 & Q56 & Q57 & Q58 & Q59 & Q60 & Q61 & Q62 & Q63

får jeg: 09-03-2006 15:09:05 1234 12345 1234 JaJaJa - og det stemmer - i hvert fald med data fra formen.

Men det er måske ikke hvad I mener med at udskrive SQL'en?
Avatar billede softspot Forsker
09. marts 2006 - 15:11 #11
Egentlig mener vi bare:

Response.Write sSQL
Avatar billede eagleeye Praktikant
09. marts 2006 - 15:13 #12
Hvis den udskriver dette:
09-03-2006 15:09:05 1234 12345 1234 JaJaJa

så kan det se ud som om Q5, Q11, Q16 er et mellemrum er det rigtigt ?

Kan du havde "tomme" tal? For så skal man enten indsætte Null eller 0 i stedet for tom "".
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:15 #13
nej, der er ingen mellemrum i udskriften, det er blot mig for at gøre det nemmere at checke.
Avatar billede eagleeye Praktikant
09. marts 2006 - 15:16 #14
ok, men prøv som softspot kommentar 09/03-2006 15:11:46
Avatar billede softspot Forsker
09. marts 2006 - 15:16 #15
Vær i øvrigt opmærksom på, at hvis du benytter checkboxe på din formular, så kommer værdien kun med i request.form, hvis den er checked, så det skal du nok sørge for at håndtere i aflæsningen af dine form-værdier. Hvis du ikke specificerer en værdi til et talfelt i databasen, så får du netop en syntaksfejl. Jeg kunne foreslå flg. tilføjelse til din aflæsning af form-felter:

function checkedValue(fld)
  if isnull(fld) then
    checkedValue = 0
  else
    checkedValue = fld
  end if
end function


Q1 = checkedValue(Request.Form("Q1"))
Q2 = checkedValue(Request.Form("Q2"))
Q3 = checkedValue(Request.Form("Q3"))
Q4 = checkedValue(Request.Form("Q4"))
Q5 = checkedValue(Request.Form("Q5"))
Q6 = checkedValue(Request.Form("Q6"))
Q7 = checkedValue(Request.Form("Q7"))
Q8 = checkedValue(Request.Form("Q8"))
'osv. for alle talfelterne
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:16 #16
Med response.write sSQL giver den:

INSERT into Games (Entry, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23, Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31, Q32, Q33, Q34, Q35, Q36, Q37, Q38, Q39, Q40, Q41, Q42, Q43, Q44, Q45, Q46, Q47, Q48, Q49, Q50, Q51, Q52, Q53, Q54, Q55, Q56, Q57, Q58, Q59, Q60, Q61, Q62, Q63) values (Now(), 1, , , , , 2, , , , , 3, , , , , 4, 1, , , , , , 2, , , , , , 3, , , , , , 4, , , , , , 5, 1, , , , , 2, , , , , 3, , , , , 4, 'Ja', '', 'Ja', '', 'Ja', '')
Avatar billede softspot Forsker
09. marts 2006 - 15:18 #17
Præcis! :)

Kuren er skitseret ovenfor :)
Avatar billede eagleeye Praktikant
09. marts 2006 - 15:21 #18
ok men så er der en masse tal som er "tomme" Q2, Q3 indeholder ikke nogen værdi. Der skal være en værdi for en tal kolonne enten 0 eller Null som er tom.
Det er en god ide at bruge en funktion som softspot lige ahr vist :)
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:27 #19
I tabellen har tal-felterne standardværdien 0, men det er altså ikke nok?
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:31 #20
Formularen er bygget op på den måde, at Q1 til Q16 dækker over et spørgsmål med fire prioterede svar. Dvs. der vil være Q-felter, der vil være tomme.
Avatar billede eagleeye Praktikant
09. marts 2006 - 15:33 #21
Jo men så skal du helt undlade de tomme Qx'er i SQL sætningen. Så kan man lave noget dymanisk opbygning eks:

strkols = " Entry "
strVals = " Now() "
for i = 1 to 58
  if Request.Form("Q"&i) <> "" then
    strkols = strkols & ", Q" & i
    strvals = strvlass & ",  & Request.Form("Q"&i)
  end if
next
og det samme med Q59..Q63

sSQL = "insert into games (" & strKols & ") values (" & strVals & ")"
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:33 #22
softspot: skal din function checkedValue(fld) kunne gælde for tal-felterne, eller også tekst-felterne, der har værdien ja eller nej?
Avatar billede eagleeye Praktikant
09. marts 2006 - 15:36 #23
hmm og så uden stavefejl i variablenavne eller virker det ikke så godt :) der er kommet dobbelt s i strvlass et sted.
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:37 #24
eagleeye: kæden er ved at hoppe af for mig, beklager.Men skal der ikke stå mere i SQL-sætningen?
Avatar billede eagleeye Praktikant
09. marts 2006 - 15:38 #25
hmm koden igen og så med tal fra 1..57 og tekst fra 58..63:


strkols = " Entry "
strVals = " Now() "
for i = 1 to 57
  if Request.Form("Q"&i) <> "" then
    strkols = strkols & ", Q" & i
    strvals = strvals & ", "  & Request.Form("Q"&i)
  end if
next
for i = 58 to 63
  if Request.Form("Q"&i) <> "" then
    strkols = strkols & ", Q" & i
    strvals = strvals & ", '"  & Request.Form("Q"&i) & "' "
  end if
next


sSQL = "insert into games (" & strKols & ") values (" & strVals & ")"
Avatar billede softspot Forsker
09. marts 2006 - 15:39 #26
09/03-2006 15:33:42 > kun for talfelterne
Avatar billede softspot Forsker
09. marts 2006 - 15:41 #27
eagleeye's løsning i 09/03-2006 15:38:26 er netop den løsning jeg nævnte i 09/03-2006 13:53:50 - nu bare i en konkret udgave ;-)
Avatar billede eagleeye Praktikant
09. marts 2006 - 15:41 #28
Hvis du har sat en default værdi og sat at kolonne ikke er obligatorik kan du udelade de tomme Qx felter så skulle databasen selv indsætte værdierne.
strKols bliver en streng som indeholder de kolonne som indeholder data og strVals bliver til streng som indeholder værdierne til kolonnerne som indeholder en værdi.

Du kan evt. også prøve atudskrive sSQL og se om koden tager det rigtige med.
Avatar billede ravnkilde Nybegynder
09. marts 2006 - 15:53 #29
I er f..... go'e! Det fungerer nu! Jeg har lært et par rigtig gode ting i dag! Læg et svar begge to...
Avatar billede softspot Forsker
09. marts 2006 - 16:00 #30
kommer her :)
Avatar billede eagleeye Praktikant
09. marts 2006 - 16:03 #31
Jeps her et svar ;-)
Avatar billede softspot Forsker
09. marts 2006 - 16:20 #32
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