Avatar billede radiohead Nybegynder
24. maj 2007 - 22:22 Der er 29 kommentarer og
2 løsninger

Giv db-felt Null-værdi

Hej

Hastesag!

Måske et dumt spørgsmål...

Jeg har en formular hvor der blandt andet er en textbox til dato.

Det skal ikke være nødvendigt at udfylde den textbox - altså ingen validering på det felt.

Men hvis der så ikke indtastes noget og man lægger det i databasen, laver den fejl.

Jeg tænkte derfor på at lave nogle if-sætninger..
altså hvis der ikke står noget i den textbox, skal det være Null.
Ellers skal den bare smide den dato ind som står i feltet.

Hvordan gør jeg?


Håber i forstår. Og spørg endelig hvis i ikke fatter det.
Avatar billede kalp Novice
24. maj 2007 - 22:26 #1
hvis det kun drejer sig om en enkelt dato så kan du bare lave 2 forskellige sql'er.. og som du selv siger en if sætning.

hvis du har flere dato'er er det smartere med en anden måde.
Avatar billede a1a1 Novice
24. maj 2007 - 22:29 #2
ala (.vb)
if not isdate(<datoen>) Then
theDate = NULL
else
theDate = ' & <datoen> & '
end if

sql = "insert into <tbl> (dDate) values (" & theDate & ") "

den dur ;o)
;o)
Avatar billede neoman Novice
24. maj 2007 - 22:32 #3
Hehe - jeg har haft kæmpe slåskamp om samme emne med MS SQL siden jeg flyttede fra den meget mere tolerante access. Jeg ved ikke hvordan folk plejer at gøre, men på nette fandt jeg et forslag til i stedet for null at bruge den mindste dato som systeet vil anerkende og betragte den som null værdi.

Eftersom jeg selv bruger smalldatetime, så bruger jeg denne her til det formål:  Dim sqlFix As New DateTime(1900, 1, 2) - hvis jeg har null i min textbox så får databasen denne værdi at spise, og omvendt, hvis jeg får den tilbage fra DB'en så lader jeg min textbox stå tom.

Kan være der  er en mere elegant løsning, men dette her virker. Og DateTime har meget større range end smalldatetime, men det kunne tæneks datoer fra før 1900 ikke har den store interesse :) så kunne du bare bruge denne.
Avatar billede kalp Novice
24. maj 2007 - 22:33 #4
man kan få fat i den mindste værdi muligt via.
DateTime.MinValue;
Avatar billede neoman Novice
24. maj 2007 - 22:35 #5
a1 - har du prøvet den løsning du beskriver med MS SQL? Min SQL vil intet have med NULL at gøre for datetime !
Avatar billede radiohead Nybegynder
24. maj 2007 - 22:39 #6
Tusind tak for hurtige svar.

a1 - vil det virke nogenlunde som det her:

if not tbDato.Text <> "" Then
tbDato.Text = NULL
end if

?
Avatar billede radiohead Nybegynder
24. maj 2007 - 22:40 #7
og så smide tbDato.text (som nu forhåbentlig er NULL) i databasen...
Avatar billede neoman Novice
24. maj 2007 - 22:41 #8
Er da også interesseret i a1's løsning.  theDate - er det en string eller en datetime ? Kan forestille mig der er en forskel nemlig.
Avatar billede radiohead Nybegynder
24. maj 2007 - 22:41 #9
neoman - det er hermed noteret. Lyder også som en idé, hvis ikke a1's virker :)
Avatar billede a1a1 Novice
24. maj 2007 - 22:42 #10
ms sql server 2000 og 2005 (67117 gange (ca.) )

ingen dato
sql = "insert into <tbl> (dDate) values (NULL)"
hvis nogen
sql = "insert into <tbl> (dDate) values ('2007-05-25') "

(du skal huske at lave dit dato felt til at acceptere NULL værdier)

Hvis du vil have dagsdato, når/hvis folk ikke skriver nogen
sql = "insert into <tbl> (dDate) values (GETDATE())) "
Avatar billede neoman Novice
24. maj 2007 - 22:43 #11
DOG  -en string kan jeg jo se ... hmm venter stadig spændt på at høre havd miljø det er afprøvet i
Avatar billede radiohead Nybegynder
24. maj 2007 - 22:43 #12
Det er for øvrigt Access i dette tilfælde... bare lige en sidenote :)
Avatar billede neoman Novice
24. maj 2007 - 22:44 #13
okaay - når jeg får tid så kan jeg "affuske" min kode så - tak for det:)
Avatar billede a1a1 Novice
24. maj 2007 - 22:44 #14
"min" theDate er en string, men den "sættes ind" i din inline sql, hvis du bruger storedprocedures kan du lave din "@datovariabel = NULL" (parametre), hvis den ikke bliver sat bliver det NULL

;o)
Avatar billede neoman Novice
24. maj 2007 - 22:46 #15
sidste spørgsmål: Hvis man opretter en record i db'en - hvad skal man så fortælle den den skal have af default for datetime ? fordi den DBNULL den får nu får den til at gå amok.
Avatar billede neoman Novice
24. maj 2007 - 22:47 #16
oh jøsses ACCESS? Den spiser jo hvad som helst :)
Avatar billede radiohead Nybegynder
24. maj 2007 - 22:49 #17
neoman - men den brokker sig dog alligevel når den ikke får noget :) Den vil åbenbart have NULL eller en dato (00-00-0000) ;-)
Avatar billede kalp Novice
24. maj 2007 - 22:52 #18
hvis den godt vil have null hvorfor skriver du så ikke bare dette?

string date = textbox.Text.Trim();
if(date == "")
date = null;

og så smid den i databsen
Avatar billede radiohead Nybegynder
24. maj 2007 - 22:55 #19
super - tror jeg har nok at gå ud fra nu.
Har ikke muligheden for at teste lige nu, men jeg stoler på at der er noget jeg kan bruge her :)


Kan i ikke lige alle lægge svar... Afsætter lige nogle flere point så :)
Avatar billede a1a1 Novice
24. maj 2007 - 22:56 #20
ms sql server og access kan stort set det samme (bortset fra fulltextindexing og andre "smarte" features, selve sql'en er stort set altid kompatibel)

;o)
Avatar billede kalp Novice
24. maj 2007 - 22:57 #21
:-)

ellers spørger du bare:)
Avatar billede kalp Novice
24. maj 2007 - 22:58 #22
det var meget flot det svar jeg lagde der
Avatar billede neoman Novice
24. maj 2007 - 22:59 #23
jaja - det kan du sagtens sige til een som har brugt 48 timer på at at tilpasse en access db til allede "smarte features" i MS SQL :)

Men som sagt - hvis du opretter en record i DBén - hvad bruger du så som default ? Frodi da jeg prøvede med dens eget forslag - DBNULL - så brokkede den sig.

Og sorry radiohead, at jeg har kidnappet din tråd lidt:) - A1 skal ha points, not me:)
Avatar billede a1a1 Novice
24. maj 2007 - 23:00 #24
;o)
Håber at du kan få det til at du

ps.: hvis du ikke skulle vide det kan du få (og bruge) ms sql server express gratis, dog et max på 4gb pr database (og en cpu(multicore skulle tælle for en), kan max bruge 1 gb ram)
Avatar billede neoman Novice
24. maj 2007 - 23:02 #25
Hmm - den hemmelighed tager du med dig i graven ? okaay - hvad er livet uden udfordringer, hehe:)
Avatar billede radiohead Nybegynder
24. maj 2007 - 23:03 #26
:P

Det er helt fint neo - jeg bliver jo også klogere, når du spørger sådan :) hehe

Tak for svar
Avatar billede radiohead Nybegynder
24. maj 2007 - 23:03 #27
flot nu fik jeg også selv lavet et svar...

nå... :P
Avatar billede a1a1 Novice
24. maj 2007 - 23:10 #28
default i sql (ms sql) er getdate() (giver dagsdato), mener at "getdate()" i access er datetime.now().

;o)
Avatar billede a1a1 Novice
24. maj 2007 - 23:18 #29
ps: brug altid amerikansk (iso sql) datoformat (åååå-mm-dd) så virker det altid, ligegyldigt hvilken server du ligger det på...(år-måned-dato)

Har selv brugt denne funktion mange gange:

Function DateToDB(ByVal sdate)
    Dim sout
    sout = "NULL"
    If Not isNull(sdate) Then
        If isDate(sdate) Then
            sout = "'" & Year(sdate) & "-" & Month(sdate) & "-" & Day(sdate) & " "
            If Hour(sdate) > 0 Or Minute(sdate) > 0 Then
                sout = sout & " " & Hour(sdate) & ":" & Minute(sdate) & ":00"
            End If
            sout = sout & "'"
        End If
    End If
    DateToDB = sout
End Function
Avatar billede radiohead Nybegynder
24. maj 2007 - 23:24 #30
Super. Takker :)
Avatar billede a1a1 Novice
27. maj 2007 - 19:33 #31
sæl tak ;o)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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