Avatar billede totalpc Seniormester
09. januar 2009 - 15:19 Der er 21 kommentarer og
1 løsning

Dato i sql statement

Hej

Jeg har følgende :
strSQL = "SELECT * FROM [log] where dato=" & request.querystring("dato") &" order by tid"
Set rs = Conn.Execute(strSQL)

Det er access

En response.write strsql giver:
SELECT * FROM [log] where dato=07-01-2009 order by tid

Men alle mine rs("") er tomme. Den skriver intet.
Jeg mistænker dato forespørgslen. Når jeg selv kigger i access står datoen på samme måde altså fx 07-01-2009.
I access er feltet dato af typen dato/tid og kort datoformat.

Hvem kan hjælpe?
Avatar billede jensgram Nybegynder
09. januar 2009 - 15:21 #1
Din response bør vel give:
SELECT * FROM [log] where dato="07-01-2009" order by tid

Jeg aner imidlertid ikke hvordan man escaper i ASP :)
Avatar billede jensgram Nybegynder
09. januar 2009 - 15:22 #2
Desuden ser det NOGET farligt ud, at du blot indsætter data fra en query string direkte i et SQL-statement!
Avatar billede totalpc Seniormester
09. januar 2009 - 15:24 #3
hmm hvorfor er det farligt? Der er et tjek på en session-login inden, er det så ikke godt nok?
Avatar billede arne_v Ekspert
09. januar 2009 - 15:34 #4
Du boer bruge parameters.

Du kan proeve:

strSQL = "SELECT * FROM [log] where dato='" & request.querystring("dato") &"' order by tid"
Set rs = Conn.Execute(strSQL)

men maaske skal tidsformatet aendres.
Avatar billede jensgram Nybegynder
09. januar 2009 - 15:35 #5
Hvad hvis jeg skriver '?dato=dato OR 1=1' i min query string?

eller '?dato=1; DROP table log; SELECT * FROM log' (med sidste SELECT for ikke at få en fejl ved ORDER BY)?
Avatar billede jensgram Nybegynder
09. januar 2009 - 15:36 #6
... men nu skal det retfærdigvis siges, at jeg jo ikke ved en kæft om ASP :) I PHP er det no-go!
Avatar billede softspot Forsker
09. januar 2009 - 17:05 #7
Det konstante datoformat i access er #datoen#. Derfor må SQL-sætningen komme til at se således ud:

strSQL = "SELECT * FROM [log] where dato=#" & request.querystring("dato") &"# order by tid"
Set rs = Conn.Execute(strSQL)
Avatar billede softspot Forsker
09. januar 2009 - 17:08 #8
Men som Arne foreslår, er jeg da også mere tilhænger af command-objektet og parameterløsningen.

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = Conn
cmd.CommandText = strSQL
cmd.Parameters.Append cmd.CreateParameter("@dato", adDate, adParamInput, 8, Request.QueryString("dato"))
set rs = cmd.Execute()

Se min artikel om samme emne, for detaljer om forudsætningerne for brugen af command-objektet som jeg illustrer overnfor: http://www.eksperten.dk/artikler/1250
Avatar billede softspot Forsker
09. januar 2009 - 17:09 #9
Hov! Jeg glemte lige strSQL, den skal så se således ud:

strSQL = "SELECT * FROM [log] WHERE dato=? ORDER BY tid"
Avatar billede totalpc Seniormester
09. januar 2009 - 18:06 #10
Arne> Din sætning giver:
SELECT * FROM [log] where dato='04-01-2009' order by tid
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression.

/logdato.asp, line 25


jensgram > Jeg tjekker jo om du har en rigtig session variabel inden fu får lov at udstede en SQL så er det vel ikke så farligt eller hvad? Jeg er på ingen måde programmeringshaj. Bare en amatør der laver noget til mig selv :)

Softspot > Jeg forstår umiddelbart intet af det du skriver om parametre :S
strSQL = "SELECT * FROM [log] where dato=#" & request.querystring("dato") &"# order by tid"
Set rs = Conn.Execute(strSQL)
giver:
SELECT * FROM [log] where dato=#04-01-2009# order by tid

Men stadig ingen resultater...felterne er stadig tomme
Avatar billede arne_v Ekspert
09. januar 2009 - 18:11 #11
Som softspot skrev bruger Access ## ikke '' omkring datoer.
Avatar billede totalpc Seniormester
09. januar 2009 - 18:15 #12
Jamen Arne_v er det ikke det jeg har prøvet i strSQL = "SELECT * FROM [log] where dato=#" & request.querystring("dato") &"# order by tid"

??
Avatar billede jensgram Nybegynder
09. januar 2009 - 19:08 #13
@18:06:12 > Nej, hvis det kun er til dig selv, er der vel næppe den store risiko :p
Avatar billede arne_v Ekspert
09. januar 2009 - 19:10 #14
Jo. Men spoergsmaalet er saa om det er MMDD versus DDMM som driller.
Avatar billede totalpc Seniormester
09. januar 2009 - 19:21 #15
jensgram > Altså nu er der selvfølgelig flere der kan se siden, men kun når man er logget ind (via noget session tjek) kan man se logs og dermed bruge denne sql sætning. Er det ikke sikkert nok så? Det er kun mig der kan logge ind!

arne_v > Du har ret, jeg prøvede manuelt i linket at bytte om på DDMM til MMDD og så virkede det. Men hvis jeg kigger i basen via access så står det også DDMM. Men laver den det om på et eller andet tidspunkt? Og hvad gør jeg?
Avatar billede jensgram Nybegynder
09. januar 2009 - 19:37 #16
totalpc > Jo, hvis du véd, at det kun er dig, der får mulighed for at eksekvere sætningen, så skulle der ikke være nogen ko på isen.
Avatar billede totalpc Seniormester
09. januar 2009 - 22:23 #17
ej kom nu gutter :)
Er det ikke forholdvis nemt??
Jeg afsætter lidt flere point
Avatar billede arne_v Ekspert
10. januar 2009 - 01:12 #18
Hvis du bruger parameters, saa ordner driveren/provideren den dato formatering for dig.
Avatar billede totalpc Seniormester
10. januar 2009 - 20:41 #19
Nå nu har jeg forsøgt med din kode softspot.
<%
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("team-emilie.mdb")
Conn.Open DSN

'strSQL = "SELECT * FROM [log] where dato=#" & request.querystring("dato") &"# order by tid"
'strSQL = "SELECT * FROM [log] where dato='" & request.querystring("dato") &"' order by tid"
'strSQL = "SELECT * FROM [log] where dato=#" & request.querystring("dato") &"# order by tid"
'response.write strsql
'strSQL1 = "SELECT count(*) as antal FROM [log] where dato=" & request.querystring("dato")

'Set rs = Conn.Execute(strSQL)
'Set rs1 = Conn.Execute(strSQL1)

strSQL = "SELECT * FROM [log] WHERE dato=? ORDER BY tid"
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = Conn
cmd.CommandText = strSQL
cmd.Parameters.Append cmd.CreateParameter("@dato", adDate, adParamInput, 8, Request.QueryString("dato"))
set rs = cmd.Execute()

%>

Men det giver en fejl. Jeg kan nok ikke forstå at sætte det ind i min kode. Kan I hjælpe?
Avatar billede totalpc Seniormester
10. januar 2009 - 20:57 #20
Nå jeg løste det sådan her:

dato = request.querystring("dato")
dato_new = month(dato) & "-" & day(dato) & "-" & year(dato)

strSQL = "SELECT * FROM [log] where dato=#" & dato_new &"# order by tid"

Tak for input. Hvem vil have point?
Avatar billede jensgram Nybegynder
11. januar 2009 - 09:20 #21
Ja, jeg bidrog jo ikke det store til _løsningen_, så ellers tak :p
Avatar billede totalpc Seniormester
19. august 2010 - 09:26 #22
lukker, tak for hjælpen
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