sql server-InvalidCastException DateTime到字符串C#



因此,我有一项有趣的任务,那就是检查别人的代码,并在尝试运行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条记录以及正确的CCD_ 5值:CCD_。我还在SQL服务器中测试了var的查询,在那里我也得到了一个有效的输出。SQL server中的BLastDateTime列列出了它的日期如下:2014-07-21 15:32:22 000(毫无疑问这有任何影响)。我还检查了SQL server中的datetype,该列的类型为datetime2

接下来,我试图获得第一条语句的列表,如下所示:

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

这导致了相同的CCD_ 11。顺便说一下,SQL数据库中BLastDateTime列上有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"))

所有这些都产生了CCD_ 13。

我现在有点不知所措,也许有人知道哪里出了问题?

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

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

相关内容

  • 没有找到相关文章

最新更新