无法将Db-date转换为DateTime

时间:2016-01-22 10:30:24

标签: c# datetime .net-3.5

我有一个来自数据库的日期,如下图所示。 DateTime-image

然而,当我将此值转换为DateTime - 实例时,我得到如下所示的错误。 enter image description here

然而,在运行代码时,我得到一个InvalidCastException,返回的值无法转换为DateTime

我在.Net3.5上使用VS2010就是为什么我想知道为什么需要这个库。

在引用的程序集中我使用IronPython,据我所知使用DLR。在.Net 3.5上,我也可以使用它来引用Microsoft.Scripting和Microsoft.Scripting.Core。我想这会以任何方式导致错误。奇怪的是,在执行产生该异常的代码时,根本不会调用使用IronPython的代码。

编辑:对于那些不相信的人:相同的代码有时会查询数据库中的某些行并返回正确的日期。但是,有一次它会引发异常。

进一步编辑:正如您在第一张图片上看到的那样row.GetValue会返回一个dynamic,这很奇怪,因为实现此代码的程序集(ArcGIS 10.2 for Desktop)也是使用.Net 3.5编写的。此外,当我转到该类型的定义时,我得object get_Value(int Index);而不是dynamic

2 个答案:

答案 0 :(得分:1)

至少需要 .NET framework 4.0 才能使用dynamic。编译器允许您定义和分配dynamic变量,但是当您尝试对dynamic变量执行任何操作时,您将遇到此错误

Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported

请参阅C# 4.0 and .Net 3.5 更多细节。归功于Aaronaught(回答这个问题)

更新:

  <。>在.Net 3.5上我可以使用它但是在引用Microsoft.Scripting和Microsoft.Scripting.Core时也是如此。我想这会以任何方式导致错误。

IronPython有自己定制的Microsoft.Scripting和Microsoft.Scripting.Core。当你再次引用这两个组件时,它将掩盖IronPythons&#39; dll并使用那些我相信导致那些奇怪行为的官方。尝试删除两个引用,看看有帮助吗

答案 1 :(得分:0)

我发现了一些非常奇怪的行为,这解释了异常。

首先,InvalidCastException完全正确,因为对row.Get_Value(2)的调用实际上已返回DBNull,当然无法将其转换为DateTime

接下来,QuickWatch中显示的值不正确,因为VS向我显示了该异常的错误行,使我假设调用(DateTime) row.Get_Value(2)导致错误调用row.Get_Value(1)(前者是前者)。然而,后者返回DBNull已经提到过。

最后但并非最不重要的是,丢失的库周围的杂乱的东西显然是由ArcGIS本身引起的。由于@pengMiao已经假设此调用实际上返回dynamic(尽管其签名仅提及object)。现在,QuickWatch不够智能,无法将其直接转换为正确的类型(在我的情况下为DateTime)。但是,如果我先写(DateTime)(object) row.Get_Value(2)首先向object提供演员,然后再向DateTime提供演员,我们会在QuickWatch和可执行文件中获得我们想要的内容。

我仍然不清楚为什么在QuickWatch中我们得到dynamic { DateTime }作为返回值的数据类型,但它现在可以正常工作。