Avatar billede bsp_andreas Nybegynder
21. september 2004 - 16:04 Der er 13 kommentarer og
1 løsning

SQL-analyse af fejl udbedes?

Således ser min SQL-streng ud: (det er i C# - asp.net):

INSERT INTO Tilbudoversigt (TilbudNr, TilbudDato) VALUES ('" + tilbudsnr.ToString() + "','" + (DateTime.Now).ToString() + "')";

Når jeg skriver strengen ud inden jeg executer den, ser den således ud:
INSERT INTO Tilbudoversigt VALUES ('40','21-09-2004 16:07:31')

Jeg får denne fejl-meddelelse:
System.Data.SqlClient.SqlException: The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value. The statement has been terminated. at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at BSPsys.Tilbud.OpretTilbud.OpretNytTilbud() in c:\inetpub\wwwroot\bspsys\tilbud\oprettilbud.aspx.cs:line 490

Jeg kan ikke forstå hvad det er der er galt.
Avatar billede bsp_andreas Nybegynder
21. september 2004 - 16:05 #1
Samme fejl viser den også i SQL-query Analyser.
Avatar billede mountmedia Nybegynder
21. september 2004 - 16:08 #2
Tjek den SQL kommando: SET DATEFORMAT ...
Avatar billede fennec Nybegynder
21. september 2004 - 16:09 #3
Datoformatet skal sikkert være yyyymmdd. Da det er en now() du indsætter kan du bruge MS-SQL's i stedet. Den hedder getdate()

INSERT INTO Tilbudoversigt (TilbudNr, TilbudDato) VALUES ('" + tilbudsnr.ToString() + "',GETDATE())";
Avatar billede fsconsult.dk Nybegynder
21. september 2004 - 16:13 #4
såfremt du har muligheden for det i C#, så benyt prepared statements istedet, så du slipper for at konvertere datoer til/fra streng repræsentation, da det er meget database/intallations specifikt, og kan være svært at flytte.
Avatar billede bsp_andreas Nybegynder
21. september 2004 - 16:19 #5
mounmedia: jeg kan ikke finde noget om SET DATEFORMAT. Hvad mener du??

fennec: Men hvad gør jeg så senere?? Jeg har f.eks. også andre dato-værdier, som brugeren har indtastet. Disse skal jo også kunne konverteres??

fsconsult: jeg kender ikke til prepared statement??
Avatar billede arne_v Ekspert
21. september 2004 - 16:26 #6
SMALLDATETIME har ikke sekunder så prøv og drop sekunderne. Og check om DD-MM
versus MM-DD er iorden.
Avatar billede fennec Nybegynder
21. september 2004 - 16:26 #7
Lav en funktion som formatere datoer rigtigt, og kør dem igennem den. Nu har jeg ikke en liggende i C#, men du kan få den til ASP jeg har, så kan du se hvad jeg mener. Det skulle du nok kunne omvende til C# :o)

Function ConvertToSqlDatetime(dato)
dim SQLYear,SQLMonth,SQLDay,SQLHour,SQLMinute
  SQLYear = Year(dato)
  SQLMonth = Month(dato)
  SQLDay = Day(dato)
  SQLHour = Hour(dato)
  SQLMinute = minute(dato)
  if SQLDay<10 then
    SQLDay = 0&SQLDay
  end if
  if SQLMonth<10 then
    SQLMonth = 0&SQLMonth
  end if
  ConvertToSqlDatetime = SQLYear&SQLMonth&SQLDay&" "&SQLHour&":"&SQLMinute
End Function
Avatar billede arne_v Ekspert
21. september 2004 - 16:27 #8
Java PreparedStatement hedder .NET parameters. Og er en god måde helt at undgå
dette (og andre) problemer på.
Avatar billede arne_v Ekspert
21. september 2004 - 22:33 #9
SqlCommand ins = new SqlCommand("INSERT INTO Tilbudoversigt (TilbudNr, TilbudDato) VALUES(@nr,@dato)", con);
ins.Parameters.Add("@nr", SqlDbType.Varchar); // hvorfor er den ikke int ????
ins.Parameters.Add("@dato", SqlDbType.DateTime);
ins.Parameters["@nr"].Value = stringvar;
ins.Parameters["@dato"].Value = datetimevar;
ins.ExecuteNonQuery();
Avatar billede bsp_andreas Nybegynder
22. september 2004 - 09:48 #10
der var den arne_v!

Jeg siger tak og der er point! :)
Avatar billede arne_v Ekspert
22. september 2004 - 17:15 #11
svar
23. september 2004 - 08:59 #12
Jeg syntes nu stadig at du burde bruge getdate() funktionen. Så får du tiden fra SQL Serveren, og derved den korrekte tid, ikke tiden fra en pcer hvor uret går som vinden blæser.
Avatar billede bsp_andreas Nybegynder
23. september 2004 - 10:07 #13
hspoulsen > jeg har kun brug for datoen, og hvis de har indstillet den forkert er det deres egen skyld :D
23. september 2004 - 11:03 #14
ok, det får så være for denne gang. Men jeg har set mange applikationer, hvor det var vigtigt at man ikke kunne snyde med dato og tid.
Et andet argument kunne være at du slap for at transmittere datoen over nettet. Det er jo vigtigt at minimere netværkstrafik.
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
Computerworld tilbyder specialiserede kurser i database-management

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