Avatar billede jaffafo Nybegynder
01. november 2004 - 19:31 Der er 26 kommentarer og
1 løsning

Dato formatering

Hejsa

Jeg har lavet en lille funktion der opretter brugere på mit site. I databasen har jeg et felt der hedder "Oprettet" der skal der smides den dato + klokkeslet hvor brugeren oprettede sig.

Jeg smider datoen ind med DateTime.Now og det fungerer udmærket, men jeg får 11/1-2004 + klokkeslet istedet for 1/11-2004 + klokkeslet

Hvorfor?

p.s. jeg har smidt denne linje på min web.config:

<globalization fileEncoding="iso-8859-1" requestEncoding="iso-8859-1" responseEncoding="iso-8859-1" culture="da-DK" uiCulture="da-DK" />
Avatar billede arne_v Ekspert
01. november 2004 - 19:35 #1
Det lyder jo faktisk som om det burde virke.

Men du kan altid eksplicit angive formatet:

dt.ToString("dd/MM/yyyy HH:mm:ss")
Avatar billede jaffafo Nybegynder
01. november 2004 - 19:51 #2
hej igen

INSERT INTO Manager VALUES(" & nyid & ",'" & txtnavn.text & "','" & txtbrugernavn.text & "','" & txtadgangskode.text & "',0-0/1900,0,true,#" & DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") & "#);

dette er min sql.

Samme problem som før. :(

kan du noget galt der?
Avatar billede arne_v Ekspert
01. november 2004 - 19:59 #3
Har du overvejet at bruge parameters fremfor rå INSERT ?
Avatar billede jaffafo Nybegynder
01. november 2004 - 20:03 #4
ja :)

laver lige det her først. Så ændrer jeg det senere..

har du evt nogle gode tips og/eller links hvor jeg kan læse lidt om parameters? jeg har nemlig aldrig prøvet det før.
Avatar billede arne_v Ekspert
01. november 2004 - 20:05 #5
Det er ret nemt.

Jeg kan levere nogle eksempler.

C# eller VB.NET ?
Avatar billede jaffafo Nybegynder
01. november 2004 - 20:13 #6
VB.NET

det ville være meget lækkert :)

men kan du finde ud af noget med den dato?  jeg testede lige og smed en <% now() %> ind på samme side..  det vises rigtigt :S

Jeg har kigget i databasen at se om det var der problemet lå, men jeg kan ikke rigtig få øje på noget :(
Avatar billede arne_v Ekspert
01. november 2004 - 20:15 #7
Kommer her:

Imports System
Imports System.IO
Imports System.Data
Imports System.Data.SqlClient

Class MainClass

    Public Shared Sub Main(ByVal args As String())
        Dim con As SqlConnection = New SqlConnection ("server=ARNEPC2\ARNEPC2RUN;Integrated Security=SSPI;database=TestMSDE")
        con.Open
        Dim cre As SqlCommand = New SqlCommand ("CREATE TABLE imgtest (id INTEGER PRIMARY KEY,img IMAGE)", con)
        cre.ExecuteNonQuery
        Dim imgfile As Stream = New FileStream ("C:\blue.jpg", FileMode.Open)
        Dim siz As Integer = imgfile.Length
        Dim imgdata(siz-1) As Byte
        imgfile.Read(imgdata, 0, imgdata.Length)
        imgfile.Close
        Dim ins As SqlCommand = New SqlCommand ("INSERT INTO imgtest VALUES(@id,@img)", con)
        ins.Parameters.Add("@id", SqlDbType.Int)
        ins.Parameters.Add("@img", SqlDbType.Image)
        ins.Parameters("@id").Value = 1
        ins.Parameters("@img").Value = imgdata
        ins.ExecuteNonQuery
        Dim sel As SqlCommand = New SqlCommand ("SELECT img FROM imgtest WHERE id = @id", con)
        sel.Parameters.Add("@id", SqlDbType.Int)
        sel.Parameters("@id").Value = 1
        Dim imgdata2 As Byte() = CType(sel.ExecuteScalar, Byte())
        Dim drp As SqlCommand = New SqlCommand ("DROP TABLE imgtest", con)
        drp.ExecuteNonQuery
        Dim imgfile2 As Stream = New FileStream ("C:\blue2.jpg", FileMode.Create)
        imgfile2.Write(imgdata2, 0, imgdata2.Length)
        imgfile2.Close
        con.Close
    End Sub
End Class
Avatar billede arne_v Ekspert
01. november 2004 - 20:16 #8
Det bruger ikke DateTime, men det er helt på samme måde.
Avatar billede jaffafo Nybegynder
01. november 2004 - 20:17 #9
og det kan også bruges på samme måde når det er Access jeg bruger?
Avatar billede arne_v Ekspert
01. november 2004 - 20:19 #10
Samme eksempel med Access:

Imports System
Imports System.IO
Imports System.Data
Imports System.Data.OleDb

Class MainClass

    Public Shared Sub Main(ByVal args As String())
        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
        con.Open
        Dim cre As OleDbCommand = New OleDbCommand ("CREATE TABLE imgtest (id INTEGER PRIMARY KEY,img OLEObject)", con)
        cre.ExecuteNonQuery
        Dim imgfile As Stream = New FileStream ("C:\blue.jpg", FileMode.Open)
        Dim siz As Integer = imgfile.Length
        Dim imgdata(siz-1) As Byte
        imgfile.Read(imgdata, 0, imgdata.Length)
        imgfile.Close
        Dim ins As OleDbCommand = New OleDbCommand ("INSERT INTO imgtest VALUES(@id,@img)", con)
        ins.Parameters.Add("@id", OleDbType.Integer)
        ins.Parameters.Add("@img", OleDbType.VarBinary)
        ins.Parameters("@id").Value = 1
        ins.Parameters("@img").Value = imgdata
        ins.ExecuteNonQuery
        Dim sel As OleDbCommand = New OleDbCommand ("SELECT img FROM imgtest WHERE id = @id", con)
        sel.Parameters.Add("@id", OleDbType.Integer)
        sel.Parameters("@id").Value = 1
        Dim imgdata2 As Byte() = CType(sel.ExecuteScalar, Byte())
        Dim drp As OleDbCommand = New OleDbCommand ("DROP TABLE imgtest", con)
        drp.ExecuteNonQuery
        Dim imgfile2 As Stream = New FileStream ("C:\blue2.jpg", FileMode.Create)
        imgfile2.Write(imgdata2, 0, imgdata2.Length)
        imgfile2.Close
        con.Close
    End Sub
End Class
Avatar billede jaffafo Nybegynder
01. november 2004 - 20:23 #11
INSERT INTO Manager VALUES(3,'l','l','l',0-0/1900,0,true,#01-11-2004 20:21:21#)

Jeg prøvede lige en response.write..  som du kan se er datoen rigtig før den kommer i databasen. Men hvorfor er den forkert når jeg hiver den ud igen?
Avatar billede arne_v Ekspert
01. november 2004 - 20:27 #12
Fordi det formentligt er databasens sprog opsætning som bestemmer ikke din applikations.
Avatar billede jaffafo Nybegynder
01. november 2004 - 20:39 #13
nu har jeg lige kigget på det og så at standard sproget for Office programmerne var engelsk. Det ændrede jeg så til dansk.

Jeg slettede databasen og lavede en ny og smed data ind igen, men samme problem.. 

det er i dansk format når det bliver smidt i databasen, men når jeg så åbner access og kigger i så er det igen forkert format :S

Har du en god løsning til det her.. jeg kan ikke rigtigt komme videre..
Avatar billede arne_v Ekspert
01. november 2004 - 20:42 #14
Hvad med at kapitulere og gemme med:

dt.ToString("MM/dd/yyyy HH:mm:ss")

?
Avatar billede arne_v Ekspert
01. november 2004 - 20:43 #15
Måske ikke så pænt. Men den pæne løsning er parameters og så forsvinder
problemet af sig selv.
Avatar billede jaffafo Nybegynder
01. november 2004 - 20:48 #16
hmm  jeg prøver sgu med de parameters så..  så kan jeg nemlig slå 2 problemer med 1 funtion ;)
Avatar billede jaffafo Nybegynder
01. november 2004 - 21:17 #17
hmm  den kan ikke godtage oledbtype.string

hvad hedder den så?

btw  ser det her ok ud?

dim con as oledbconnection = Dataoledb.con("blabla")
Dim ins As OleDbCommand = New OleDbCommand ("INSERT INTO Manager VALUES(@nyid,'@navn','@email','@adgangskode',@sidst_login,@antal_login,@aktiv,@oprettet);" , con)
ins.Parameters.Add("@nyid", OleDbType.Integer)
ins.Parameters.Add("@navn", OleDbType.Char)
ins.Parameters.Add("@email", OleDbType.Char)
ins.Parameters.Add("@adgangskode", OleDbType.Char)
ins.Parameters.Add("@sidst_login", OleDbType.Date)
ins.Parameters.Add("@antal_login", OleDbType.Integer)
ins.Parameters.Add("@aktiv", OleDbType.Boolean)
ins.Parameters.Add("@oprettet", OleDbType.Date)
ins.Parameters("@nyid").Value = nyid
ins.Parameters("@navn").Value = txtnavn.text
ins.Parameters("@email").Value = txtbrugernavn.text
ins.Parameters("@adgangskode").Value = txtadgangskode.text
ins.Parameters("@sidst_login").Value = now()
ins.Parameters("@antal_login").Value = 0
ins.Parameters("@aktiv").Value = true
ins.Parameters("@oprettet").Value = now()

ins.ExecuteNonQuery
Avatar billede arne_v Ekspert
01. november 2004 - 21:19 #18
OleDbType.VarChar
Avatar billede arne_v Ekspert
01. november 2004 - 21:20 #19
Og jeg tror at OleDbType.Date skal være OleDbType.DBTimeStamp medmindre du kun
vil gemme dato delen.
Avatar billede jaffafo Nybegynder
01. november 2004 - 21:21 #20
er der en måde jeg kan udskrive sql sætningen?

noget i stil med:  response.write(ins.tostring.())
Avatar billede jaffafo Nybegynder
01. november 2004 - 21:24 #21
YaY!!!  det virker nu :D

med rigtige datoer og det hele. :)  + nu kan jeg sqlparametre ;)

smid lige et svar :)
Avatar billede jaffafo Nybegynder
01. november 2004 - 21:24 #22
vil dog gerne have svar på denne her også:

er der en måde jeg kan udskrive sql sætningen?

noget i stil med:  response.write(ins.tostring.())
Avatar billede arne_v Ekspert
01. november 2004 - 21:25 #23
svar
Avatar billede arne_v Ekspert
01. november 2004 - 21:26 #24
Jeg mener ikke at du kan udskrive den færdige SQL.

Bl.a. fordi parameters jo kan bruge stil at indsætte binære data med.
Avatar billede jaffafo Nybegynder
01. november 2004 - 21:27 #25
ok.. men jeg takker mange gange :)
Avatar billede arne_v Ekspert
01. november 2004 - 21:27 #26
Og du har slået mange fluer med et smæk.

Du behøver heller ikke bekymre dig om ' i input.

O'Toole er ikke noget problem.

Ondsindede hackere kan ikke lave SQL injection.
Avatar billede arne_v Ekspert
01. november 2004 - 21:29 #27
Hvis du udfører dette en gang:

Dim ins As OleDbCommand = New OleDbCommand ("INSERT INTO Manager VALUES(@nyid,'@navn','@email','@adgangskode',@sidst_login,@antal_login,@aktiv,@oprettet);" , con)
ins.Parameters.Add("@nyid", OleDbType.Integer)
ins.Parameters.Add("@navn", OleDbType.Char)
ins.Parameters.Add("@email", OleDbType.Char)
ins.Parameters.Add("@adgangskode", OleDbType.Char)
ins.Parameters.Add("@sidst_login", OleDbType.Date)
ins.Parameters.Add("@antal_login", OleDbType.Integer)
ins.Parameters.Add("@aktiv", OleDbType.Boolean)
ins.Parameters.Add("@oprettet", OleDbType.Date)

og dette mange gange (med forskellige data):

ins.Parameters("@nyid").Value = nyid
ins.Parameters("@navn").Value = txtnavn.text
ins.Parameters("@email").Value = txtbrugernavn.text
ins.Parameters("@adgangskode").Value = txtadgangskode.text
ins.Parameters("@sidst_login").Value = now()
ins.Parameters("@antal_login").Value = 0
ins.Parameters("@aktiv").Value = true
ins.Parameters("@oprettet").Value = now()

så vil du opleve en lille smule bedre performance også.
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