15. april 2008 - 22:51Der er
24 kommentarer og 1 løsning
Problemer med dato-variabel
Hejsa.
Jeg har en listbox hvor jeg kan vælge nogle datoer i formatet: 02-05-2008. Den kommer i en request("start") - som jeg forsøger at bruge sådan:
if request("start")="" then dim start start=now() else start = request("start") end if sql = "SELECT * from [arbejdsdetaljer] where dato > start ORDER BY dato" Men den skriver den mangler en parameter. Skriver jeg now() i stedet, virker det fint. Kan man ikke få den til at acceptere datoen på den anden måde - og hvordan????
Men den vil slet ikke lege med mig. Kan jeg ikke angive en dato (f.eks. 02-05-2008) som den kan sammenligne med et datofelt i databasen, eller skal det gøres anderledes? Eksempel: start ="02-05-2008" 'end if sql = "SELECT * from [arbejdsdetaljer] where dato > " & start & " ORDER BY dato"
set rstemp = conntemp.execute(sql) do while not (rstemp.eof or rstemp.bof)
Når jeg skriver sådan, så får jeg ALLE datoer i tabellen - også dem der er yngrer end 2 maj. Hvad gør jeg galt?
Der er over hovedet ikke noget der dur - uanset hvordan jeg skrive datoen. Den eneste måde jeg kan få "resultat" er ved at vende > om, for så får jeg ikke noget...
Eller endnu bedre, brug Command-objektet og parametre, så er du fri for at bøvle med de der strenge.
. . . set cmd = Server.CreateObject("ADODB.Command") set cmd.ActiveConnection = conn cmd.CommandType = adCmdText cmd.CommandText = "SELECT * from [arbejdsdetaljer] where dato > ? ORDER BY dato" cmd.Parameters.Append cmd.CreateParameter("@start", adDate, adParamInput, 8, cdate(start)) set rs = cmd.Execute() . . .
swamboo, jeg kan ikke helt forstå du afviser olhansen's svar så hurtigt, for det er da rigtig nok at ISO-formatet fungerer. Du skal bare sørge for at overføre datoen i et korrekt Access-format (som jeg angav i mit post fra 15/04-2008 23:00:26), altså med # omkring datoen i strengen:
sql = "SELECT * from [arbejdsdetaljer] where dato > #" & year(start) & "-" & month(start) & "-" & day(start) & "# ORDER BY dato"
15/04-2008 23:36:43 >> I sin grundform skal du kunne det jeg har illustreret, men der er naturligvis mange andre muligheder for at udnytte Command-objektet. Fordelen ved Command-objektet er at du er afskærmet fra SQL-injections, hvor folk prøver at smide SQL i formfelter for at få adgang til dine data eller ødelægge dem. Parametrene sørger for at data bliver overført i det format du angiver og hvis typen ikke er korrekt, så får du en fejl i sylten, hvilket umiddelbart er bedre end at dine data bliver smadret. Du slipper stadig ikke for at validere dine data, men du får en renere (og mere objektbaseret) grænseflade til din database end du har med det populære "strengsammensætningssnask".
Hmmm - du har helt sikkert ret - men sagen er bare at det overhovedet ikke virker - og jeg fatter ikke hvorfor. Sidder og bliver lidt panisk angst for at jeg har lavet et eller andet dumt et sted, for jeg mener da ikke at det med datoer skulle være så stort et problem.
Hvis du skal benytte konstanter som jeg gjorde i mit eksempel, så skal du enten smide denne linie ind i toppen af den ASP-fil hvor du vil bruge konstanterne, eller i global.asa, som ligger i roden af din web-applikation:
Datoformatet skulle være 02-05-08 - selvfølgelig det eneste jeg ikke prøvede...
Hvem af jer vil have mine point - for i har virkelig været oprigtige!! 1000 tak for jeres hjælp - det er meget værdsat - og softspot: Jeg tager lige en kikker på det du skrev, det lyder spændende!!
Jeg kan varmt anbefale Command-objektet! Jeg bruger det selv til daglig og har fået bygget nogle rutiner, så det bliver let af arbejde med og jeg kun skal gøre et mínimalt stykke ekstra arbejde for at kalde min database med parametre i forhold til strengsammensætningsmetode. Koden bliver mere overskuelig, herunder også dine SQL-sætninger, som ikke længere flakser frem og tilbage mellem VBS og SQL (i mere komplekse situtioner kan dette være ekstremt svært at gennemskue, hvis man ikke er ultra disciplineret med sin kode).
Der er naturligvis altid situationer hvor det ikke kan betale sig at bruge Command-objektet og jeg vil kun anbefale det i de situationer, hvor du skal overføre værdier som du ikke selv har skabt og stoler 100% er korrekte rent data og formatmæssigt. Derfor vil jeg, til en simpel optælling af rækker i en tabel, stadig benytte:
set rs = conn.Execute("SELECT COUNT(*) FROM tabel")
da der naturligvis er et overhead ved at oprette et command-objekt og fyre det af.
Jeg tror du kan finde mere om Command-objekter end du gider læse. Prøv at søge efter "ADODB.Command parameters", så tror jeg der dukker noget op. Jeg tager altid selv udgangspunkt i Microsoft's MSDN, men mange synes ikke det er godt. Jeg har dog fundet en del artikler derind som også kigger på teknologierne fra et lidt mere praktisk perspektiv.
herfra kan du komme videre til programmer's guide og referencemanual, hvor du nok finder noget om Command-objektet begge steder, hvis jeg ikke tager meget fejl. Jeg vil også tro du kan finde nogle artikler om emnet på MSDN (selvom de sikkert vil være gamle - det er jo trods alt en bedaget teknologi :)).
Tak for point og held og lykke med Command-objektet :)
Synes godt om
Ny brugerNybegynder
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.