转换DateTime会抛出SqlDateTime溢出

时间:2015-06-16 19:28:46

标签: c# datetime

目前我有一个带日期和时间的字符串。当我显示字符串时,它看起来像:

  

2015-06-16 09:17:28 PM

但是当我试图将它放入数据库时​​,它会告诉我:

  

附加信息:SqlDateTime溢出。必须在17/1年1月1日之间   上午12:00:00和12/31/9999 11:59:59 PM。

我要转换字符串。所以现在有另外一种方式!

正确的方法是什么?显然,数据库中的值是datetime。

这是我的代码(我实际上将它放在一起,来自多个类):

    string time = date + " " + txtTime.Text;
    DateTime temp = Convert.ToDateTime(time);
    String query ="insert into reserveringen (reserveringId,klantId,medewerkerId,aantalPersonen,begintijd,eindtijd)values(@reserveringId,@klantId,@medewerkerId,@aantalPersonen,@begintijd,@eindtijd)";
    SqlCommand comm = sqlCrud.returnSqlCommand(query);
    comm.Parameters.AddWithValue("begintijd",temp);

我已经google了很多....但没有任何作用。

由于

2 个答案:

答案 0 :(得分:1)

你不应该那样使用Convert.ToDateTime。您应该使用DateTime.ParseDateTime.ParseExact

DateTime temp = DateTime.ParseExact(time, "yyyy-MM-dd hh:mm:ss tt", CultureInfo.InvariantCulture);

由于DateTime.Parse(temp)适合你,你可以保留它。

编辑:

在这种情况下,两种方法之间的差异非常重要

Convert.ToDateTime(s)

此方法将使用以下参数在内部调用DateTime.Parse

DateTime.Parse(s, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None);

现在,DateTime.Parse(s)做了一些不同的事情:

DateTime.Parse(s, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AllowWhiteSpaces);

区别在于DateTimeStyles标志。此标志完全会更改输出。 Convert.ToDateTime(s)可能会返回DateTime.MinValue对象,这是遇到null字符串时的操作。 (我只能在没有花费更多时间研究的情况下猜测,但结果是有意义的,因为DateTime.MinValue1/1/0001 12:00:00 AM,这超出了SQL期望的范围。)

参考文献:

http://bytes.com/topic/c-sharp/answers/482419-convert-todatetime-vs-system-datetime-parse

https://msdn.microsoft.com/en-us/library/system.datetime.parse(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.datetime.minvalue(v=vs.110).aspx

答案 1 :(得分:0)

两者

DateTime.Parse("2015-06-16 09:17:28 PM");

Convert.ToDateTime(date);

将返回相同的DateTime值。

我会尝试专注于查询。

请注意,您可能正在从C#传递一个值,该值解析了DateTime(1/1/0001 12:00:00 AM)的最小值,这超出了SQL Server上DateTime值的范围。