因此,我有一项有趣的任务,那就是检查别人的代码,并在尝试运行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")