InvalidCastException DateTime to String C#

时间:2015-07-02 09:33:55

标签: c# sql-server datetime casting

所以我有一个有趣的任务来检查别人他的代码,并在尝试运行Web应用程序时立即发现问题。当我点击某个按钮时,我收到Invalid Cast Exception from DateTime to String。我已经阅读了很多关于此的帖子并尝试了几个但是它们似乎没有用,或者我不知道如何在这个特定的代码中应用它。

我向原始代码创建者解决了这个问题,但是在他的系统上,代码可以工作(我们使用相同的数据库和visual studio)。所以这让我相信这是一个culture setting问题(这是因为他住在印度和我在荷兰,所以很可能)。我尝试了一些设置文化信息的东西,但这似乎不起作用。

我真的不知道到底出了什么问题,所以下面我发布了调查结果,尝试了调整,代码输出和代码说明:

在Web应用程序中,用户可以单击特定的订单号,当他们这样做时,他们可能会看到该订单的一些详细信息。虽然点击它时我得到了cast exception

var updatedBookedHourData = (from b in bookedHourList
                                         let BLastDateTime = b.Field<string>("BLastDateTime") == null ? (DateTime?)null : DateTime.Parse(b.Field<string>("BLastDateTime"))
                                         let BSyncDateTime = b.Field<string>("BSyncDateTime") == null ? (DateTime?)null : DateTime.Parse(b.Field<string>("BSyncDateTime"))
                                         where !BLastDateTime.HasValue ||
                                         !BSyncDateTime.HasValue ||
                                         BLastDateTime > BSyncDateTime
                                         select new
                                         {
                                             Ordernumber = b.Field<int>("Ordernumber"),
                                             Position = b.Field<string>("Position"),
                                             Rate = b.Field<string>("Rate"),
                                             WorkType = b.Field<string>("WorkType")
                                         }).ToList();

强制转换异常位于此特定行:

let BLastDateTime = b.Field<string>("BLastDateTime") == null ? (DateTime?)null : DateTime.Parse(b.Field<string>

接下来我做了一些研究。首先,我看了VAR UpdatedBookedHourData的输出是什么样的:

var updatedBookedHourData3 = (from b in bookedHourList
                                          select b).ToList();

这导致了约400条记录以及正确的datetime值:21-7-2015 15:32:22。我还测试了SQL服务器中var的查询,在那里我也得到了有效的输出。 SQL服务器中的BLastDateTime列列出了它的日期,如下所示:2014-07-21 15:32:22 000(不知道这有什么影响)。我还检查了SQL服务器中的datetype,并且该列的类型为datetime2

接下来,我尝试在第一个语句中获取列表,如下所示:

var updatedBookedHourData2 = (from b in bookedHourList
                                         select new {test = b.Field<string>("BLastDateTime") }).ToList();

这导致了相同的invalid cast exception (datetime to string)。顺便提一下BLastDateTime列上的SQL数据库中有0个NULL值。

因为这一切都在他的系统创作者身上起作用,所以我尝试用文化信息做点什么:

我尝试了以下所有方法:

let BLastDateTime = b.Field<string>("BLastDateTime") == null ? (DateTime?)null : DateTime.Parse(b.Field<string>("BLastDateTime"),CultureInfo.InvariantCulture)

let BLastDateTime = b.Field<string>("BLastDateTime") == null ? (DateTime?)null : DateTime.Parse(b.Field<string>("BLastDateTime"),CultureInfo.CurrentCulture)

let BLastDateTime = b.Field<string>("BLastDateTime") == null ? (DateTime?)null : DateTime.Parse(b.Field<string>("BLastDateTime"),CultureInfo.CreateSpecificCulture("en-US"))

所有这些都导致了InvalidCastException

我现在有点想法,也许有人知道哪里出错了?

1 个答案:

答案 0 :(得分:2)

它可以是数据库中的DATE / DATETIME字段。根据错误消息,它是一个投射问题。您需要将其强制转换为C#等效System.DateTime而不是String

b.Field<System.DateTime>("BLastDateTime")