Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用Convert.ToDateTime转换SQL日期值失败_C#_Sql Server_Datetime_Datetime Conversion - Fatal编程技术网

C# 在C中使用Convert.ToDateTime转换SQL日期值失败

C# 在C中使用Convert.ToDateTime转换SQL日期值失败,c#,sql-server,datetime,datetime-conversion,C#,Sql Server,Datetime,Datetime Conversion,首先,我得到的错误如下: 将varchar数据类型转换为datetime数据类型导致值超出范围 我所做的是将一组数据从SQL数据库返回到datatable中,然后在c代码端运行if语句,以确定一个日期是否大于另一个日期。这在许多部署中都有效,但是在新服务器上的特定部署会导致上述错误 这是我的密码: if ( Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString()).Date > Convert.ToDa

首先,我得到的错误如下:

将varchar数据类型转换为datetime数据类型导致值超出范围

我所做的是将一组数据从SQL数据库返回到datatable中,然后在c代码端运行if语句,以确定一个日期是否大于另一个日期。这在许多部署中都有效,但是在新服务器上的特定部署会导致上述错误

这是我的密码:

if
(
    Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString()).Date >
    Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString()).Date
)
{
   ... do stuff ...
}
我的理解是,在尝试执行Convert.ToDateTime时,列中转换为字符串的数据失败

然而,令人困惑的问题是,这段代码已经在其他服务器上运行,并且这个问题是孤立的。所以我知道它可能是服务器独有的,但我不知道该去哪里找

不幸的是,更改任何区域设置等都不是一个选项,所以我正在尝试找到一种解决方法


感谢您的帮助

也许你可以试试这个

        if (Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString("yyyyMMdd HH:mm:ss")).Date > Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString("yyyyMMdd HH:mm:ss")).Date) 
        {
                ...do stuff...
        }

也许你可以试试这个

        if (Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString("yyyyMMdd HH:mm:ss")).Date > Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString("yyyyMMdd HH:mm:ss")).Date) 
        {
                ...do stuff...
        }

基本上,您不应该首先将值转换为字符串并返回。尽可能避免字符串转换,除非这是您尝试执行的重要部分。在您的例子中,您确实对日期时间值感兴趣。它们是数据库中的DateTime,您希望它们在代码中作为DateTime值,那么为什么要引入字符串呢

您应该能够使用:

DataRow row = ds.Tables[0].Rows[0];
DateTime startDate = (DateTime) row["StartDate"];
DateTime originalStartDate = (DateTime) row["OriginalStartDate"];
if (startDate.Date > originalStartDate.Date)
{
    ...
}

基本上,您不应该首先将值转换为字符串并返回。尽可能避免字符串转换,除非这是您尝试执行的重要部分。在您的例子中,您确实对日期时间值感兴趣。它们是数据库中的DateTime,您希望它们在代码中作为DateTime值,那么为什么要引入字符串呢

您应该能够使用:

DataRow row = ds.Tables[0].Rows[0];
DateTime startDate = (DateTime) row["StartDate"];
DateTime originalStartDate = (DateTime) row["OriginalStartDate"];
if (startDate.Date > originalStartDate.Date)
{
    ...
}

数据库中日期的格式是什么?很可能日期是以一种格式记录的,而您的转换是以另一种格式运行的。数据库中的类型是什么?它应该是DateTime,这意味着您根本不应该转换为字符串并返回。只需使用if DateTime ds.Tables[0]。行[0][StartDate]>DateTime ds.Tables[0]。行[0][OriginalStartDate]双重检查两个字段的类型是否为DateTime@我将据此尝试你的建议。至于格式,它看起来像2015-07-01 00:00:00.000@MPelletierCan你能从数据库中发布一些数据,让我们看看格式是什么吗?@JonSkeet你的答案帮我整理好了!谢谢数据库中日期的格式是什么?很可能日期是以一种格式记录的,而您的转换是以另一种格式运行的。数据库中的类型是什么?它应该是DateTime,这意味着您根本不应该转换为字符串并返回。只需使用if DateTime ds.Tables[0]。行[0][StartDate]>DateTime ds.Tables[0]。行[0][OriginalStartDate]双重检查两个字段的类型是否为DateTime@我将据此尝试你的建议。至于格式,它看起来像2015-07-01 00:00:00.000@MPelletierCan你能从数据库中发布一些数据,让我们看看格式是什么吗?@JonSkeet你的答案帮我整理好了!谢谢谢谢你,乔恩。这里100%正确。我意识到在基地,我试图削减一些角落,这只是引起了我的头痛,当然字符串转换是不必要的。谢谢你的洞察力。谢谢。如果你的数据允许为空,那么我会选择DateTime?ColumnName=DateTime?dr[ColumnName]==DBNull.Value?null:dr[ColumnName];即使不允许空值,如果您以后决定更改模式以允许空值,运行此逻辑仍然是安全的。谢谢Jon。这里100%正确。我意识到在基地,我试图削减一些角落,这只是引起了我的头痛,当然字符串转换是不必要的。谢谢你的洞察力。谢谢。如果你的数据允许为空,那么我会选择DateTime?ColumnName=DateTime?dr[ColumnName]==DBNull.Value?null:dr[ColumnName];即使不允许空值,如果您以后决定更改模式以允许空值,运行此逻辑仍然是安全的。