Avatar billede jens_houmann Nybegynder
15. august 2006 - 17:55 Der er 14 kommentarer og
1 løsning

Datoformat SQL Server tilgået via C# og ASP.NET

Er ved at lave et ASP.NET program i C# med en MS SQL Server DB.
I tabellen PizzaOrdreTabel er defineret et felt: OrdreDato af typen datetime.

Herunder er koden til at oprette en post i PizzaOrdreTabellen.
Det underlige er at linie 2 giver en dato i formatet: dd-mm-aaaa tt:mm:ss (bindestreger i datoen) hvilket SQL Server ikke

accepterer.
Det giver følgende fejl:

System.Data.SqlClient.SqlException: The conversion of a char data type to a datetime data type resulted in an out-of-range

datetime value. The statement has been terminated. at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at

ASP.OpretOrdre_aspx.RegistrerOrdre()

Når jeg bruger linie 12 (som nu er kommenteret ud) med / kører alt fint.

Altså: databasen forventer amerikansk datoformat, mens systemet, naturligt nok, leverer en dansk formatteret dato.
Er der en parameter jeg kan indsætte så jeg får rigtigt datoformat begge steder??

Jeg vil nødigt til hard-codemæssigt at fjerne bindestregerne og anvende Convert.ToDateTime.


--------------------------------------------------------------------------------------------------------------


1    int intAntal = Convert.ToInt16(tbAntal.Text);
2    DateTime dtDato = Convert.ToDateTime(DateTime.Now);
3       
4    string strConnection = "user id=jh;password=*******;Initial Catalog=Pizza;data source=(local)";
5      SqlConnection objConnection = new SqlConnection(strConnection);
6       
7       
8    strSQL = "INSERT into PizzaOrdreTabel values (" + drpData1.SelectedIndex + ",";
9    strSQL += drpData2.SelectedIndex + "," + intAntal + ",'" + dtDato + "',";
10    strSQL += "1" + ",'" + dtDato + "')";
11       
12    //strSQL = "INSERT into PizzaOrdreTabel values(2,3,4,'2006/08/15',0,'2005/08/16')";
13   
14    try
15          {
16          objConnection.Open();
17            lblBesked1.Text="Forbindelse til DB er etableret";
18          SqlCommand myCommand = new SqlCommand(strSQL, objConnection);
19        myCommand.ExecuteNonQuery();
20                  }
21    catch (Exception e)
22          {
23            lblBesked3.Text="Etablering af forbindelse fejlet!";
24          lblBesked4.Text=e.ToString();
24          }

----------------------------------------------------------------------------------------------------------------
Avatar billede nielle Nybegynder
15. august 2006 - 18:05 #1
Jeg vil anbefale dig at bruge Parameters, så er du helt fri for at tænke over den skags konverterings-problemer.
Avatar billede nielle Nybegynder
15. august 2006 - 18:18 #2
int intAntal = Convert.ToInt16(tbAntal.Text);
            DateTime dtDato = Convert.ToDateTime(DateTime.Now);

            string strConnection = "user id=jh;password=*******;Initial Catalog=Pizza;data source=(local)";
            SqlConnection objConnection = new SqlConnection(strConnection);

            strSQL = "INSERT INTO PizzaOrdreTabel VALUES (" + drpData1.SelectedIndex + ",";
            strSQL += drpData2.SelectedIndex + "," + intAntal + ", @dtDato,";  // <---- Her...
            strSQL += "1" + ", @dtDato)";  // <---- ...og her...

            try
            {
                objConnection.Open();
                lblBesked1.Text = "Forbindelse til DB er etableret";
                SqlCommand myCommand = new SqlCommand(strSQL, objConnection);

                myCommand.Parameters.Add("@dtDato", SqlDbType.DateTime);  // <---- ...og her...
                myCommand.Parameters["@dtDato"].Value = dtDato;  // <---- ...og her

                myCommand.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                lblBesked3.Text = "Etablering af forbindelse fejlet!";
                lblBesked4.Text = e.ToString();
            }
Avatar billede nielle Nybegynder
15. august 2006 - 18:18 #3
Og legeledes for dine andre værdier som du vil have ind i din SQL-sætning.
Avatar billede jens_houmann Nybegynder
15. august 2006 - 18:38 #4
Det vil jeg prøve. Hvad er den dybere mening med linierne:

myCommand.Parameters.Add("@dtDato", SqlDbType.DateTime);  // <---- ...og her...
myCommand.Parameters["@dtDato"].Value = dtDato;  // <---- ...og her

Er dtDato ikke sat på dette tidspunkt?
Er det en anden måde at gøre det på?
Avatar billede jens_houmann Nybegynder
15. august 2006 - 19:01 #5
Får nu følgende fejl: System.Data.SqlClient.SqlException: Prepared statement '(@dtDato datetime)INSERT into PizzaOrdreTabel values (4,1,1,'15-' expects parameter @dtDato, which was not supplied. at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at ASP.OpretOrdre_aspx.RegistrerOrdre()
Avatar billede nielle Nybegynder
15. august 2006 - 19:02 #6
Denne linje:

myCommand.Parameters.Add("@dtDato", SqlDbType.DateTime);

fortæller over for SQL serveren at der er en parameter som hedder "@dtDato" og at den er af tyben DateTime. Parameteren henviser til der hvor at der er skrevet "@dtDato" i SQL'en:

strSQL = "INSERT INTO PizzaOrdreTabel VALUES (" + drpData1.SelectedIndex + ",";
strSQL += drpData2.SelectedIndex + "," + intAntal + ", @dtDato,";
strSQL += "1" + ", @dtDato)";

På dette tidspunkt er der ingen binding mellem Parameteren "@dtDato" og din variable med navnet "dtDato".

Denne linje fortæller:

myCommand.Parameters["@dtDato"].Value = dtDato;

- at "@dtDato" parameteren skal være lig med værdien af din varaiable dtDato.
Avatar billede nielle Nybegynder
15. august 2006 - 19:09 #7
Faktisk behøver du slet ikke at derfinere dtDato-variablen, ide du direkte kan skrive:

myCommand.Parameters["@dtDato"].Value = DateTime.Today;
Avatar billede nielle Nybegynder
15. august 2006 - 19:14 #8
F.eks. sådan:

            string strConnection = "user id=jh;password=*******;Initial Catalog=Pizza;data source=(local)";
            SqlConnection objConnection = new SqlConnection(strConnection);

            strSQL = "INSERT INTO PizzaOrdreTabel VALUES (" + drpData1.SelectedIndex + ",";
            strSQL += drpData2.SelectedIndex + ",@intAntal,@dtDato,1,@dtDato)";

            try
            {
                objConnection.Open();
                lblBesked1.Text = "Forbindelse til DB er etableret";
                SqlCommand myCommand = new SqlCommand(strSQL, objConnection);

                myCommand.Parameters.Add("@dtDato", SqlDbType.DateTime);
                myCommand.Parameters.Add("@intAntal", SqlDbType.Int);

                myCommand.Parameters["@dtDato"].Value = DateTime.Today;
                myCommand.Parameters["@intAntal"].Value = tbAntal.Text;

                myCommand.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                lblBesked3.Text = "Etablering af forbindelse fejlet!";
                lblBesked4.Text = e.ToString();
            }
Avatar billede jens_houmann Nybegynder
15. august 2006 - 19:39 #9
Ok, fint nok. Har været i bøgerne og MSDN og set Parameters.
Desværre vil dtDato stadig have et format som SQL Server ikke vil acceptere.
Har forsøgt:

DateTime dtDato = DateTime.UtcNow;

men SQL-server forventer stadig at datoen er med skråstreger og ikke bindestreg som i dansk og Utc.
Vil kigge lidt på opsætning af feltet i tabellen.
Avatar billede nielle Nybegynder
15. august 2006 - 20:12 #10
Du må gøre et eller andet anderledes? for det fungere altså korrekt her hos mig.

En af fordelene (der er flere) ved parametre er at du ikke behøver at tænke på skråstreger eller noget. Du fortæller at du har i siden at give den en DateTime-værdi, og så finder den selv ud af at oversætte til det korrekte format for dern anvendte database.
Avatar billede jens_houmann Nybegynder
15. august 2006 - 20:36 #11
Ja, Sgu. Nu virker det. Mange tak.
Hvordan gør jeg med point?
Avatar billede nielle Nybegynder
15. august 2006 - 20:41 #12
Jeg skal lægge et svar først.

Værsgiod :^)
Avatar billede nielle Nybegynder
15. august 2006 - 20:43 #13
Prug parameter. Det spare deig for mange problemer og det øger endda sikkerheden i din applikation!

Du kan jo prøve at starte med at lave drpData1.SelectedIndex og drpData2.SelectedIndex i det ovenstående om til parametre. Og du kan bare spørge hvis du får problemer. :^)
Avatar billede nielle Nybegynder
15. august 2006 - 20:44 #14
Prøv også lige at kigge på denne her:

http://www.eksperten.dk/artikler/831
Avatar billede jens_houmann Nybegynder
15. august 2006 - 20:54 #15
Ja, jeg skal vist lige have fat i min MSDN igen. Tak endnu en gang.
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