2016-01-22 91 views
0

我有一个数据库的日期,如下图所示。 DateTime-image无法将Db日期转换为DateTime

但是,当我将此值转换为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的桌面),也使用。此外,当我进入该类型的定义时,我得到object get_Value(int Index);而不是dynamic

+2

你有没有尝试Convert.ToDateTime()或DateTime.Parse() –

+2

提供一些代码会很好,特别是你的使用和参考 –

+0

你已经尝试过。 –

回答

1

您需要至少.NET框架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的dll并使用那些我认为会导致这些奇怪行为的官员。尝试删除这两个参考,看看有帮助

+0

我知道我只能在4.0以上使用'dynamic'。不过,我没有像在第二次更新中看到的那样使用keyowrd。 – HimBromBeere

+1

基于http://www.mikesdotnetting.com/article/214/how-to-check-if-a-query-returns-data-in-asp-net-web-pages, 当您使用'queryvalue'或'querysingle'它实际上返回一个'动态'对象 – pengMiao

+0

你正在使用哪个版本的ironpython? – pengMiao

0

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

首先把InvalidCastException是绝对正确的调用row.Get_Value(2)实际返回DBNull这当然不能被转换为DateTime

接下来,在快速监视显示的值wasn't正确的,如VS表明我该异常的whrong线使我假设该呼叫到(DateTime) row.Get_Value(2)引起错误,而不是调用row.Get_Value(1)(其preceds前者)。然而后者如上所述返回DBNull

最后但并非最不重要的东西显然是由ArcGIS本身造成的。由于@pengMiao已经假定这个电话实际上返回dynamic(虽然其签名只提到object)。现在QuickWatch不够聪明,直接将其转换为正确的类型(在我的示例中为DateTime)。但是,如果我写(DateTime)(object) row.Get_Value(2)首先提供object,然后到DateTime,我们就可以得到我们想要的QuickWatch和可执行文件。

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