【问题标题】:Cannot convert Db-date to DateTime无法将 Db-date 转换为 DateTime
【发布时间】:2016-04-28 22:06:40
【问题描述】:

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

但是,当我将此值转换为 DateTime-instance 时,我收到如下所示的错误。

但是,在运行代码时,我得到一个 InvalidCastException,返回的值不能转换为 DateTime

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

据我所知,在引用的程序集中,我使用的是使用 DLR 的 IronPython。在 .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

【问题讨论】:

  • 你试过 Convert.ToDateTime() 还是 DateTime.Parse()
  • 提供一些代码会很好,尤其是你的 usings 和 refs
  • 你尝试了什么?
  • @KrishnaPS 产生同样的错误。
  • 这有帮助吗? stackoverflow.com/questions/13566887/… 看来您需要使用 .NET Framework 4 或更高版本。

标签: c# datetime .net-3.5


【解决方案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 的 dll 并使用我认为会导致这些奇怪行为的那些官方。尝试删除这两个参考,看看是否有帮助

【讨论】:

  • 我知道我只能在 4.0 以上使用dynamic。但是,正如您在第二次更新中看到的那样,我没有使用 keyowrd。
  • 基于mikesdotnetting.com/article/214/…,当你使用queryvaluequerysingle它实际上返回一个dynamic对象
  • 您使用的是哪个版本的 Ironpython?
  • @HimBromBeere 您能否发布您的 row.getValue() 代码或有关任何第三方库(包括 nuget 包)或程序集使用的信息,以便我们挖掘更多信息?
  • 代码是在 ArcGIS10 for Desktop 中提供的——但是我很确定它们不会返回任何动态,因为该程序集已经使用了多年,甚至在 .NET 2.0 上都没有注意到这种行为.
【解决方案2】:

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

首先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 } 作为返回值的数据类型,但它现在可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多