09. marts 2006 - 13:44Der 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!
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...
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.
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.
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.
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:
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
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 :)
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 & ")"
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 & ")"
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.
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.