C# Npgsql:不支持时间戳的旧浮点表示形式

C# Npgsql:不支持时间戳的旧浮点表示形式,c#,postgresql,floating-point,npgsql,C#,Postgresql,Floating Point,Npgsql,我编写了一个基本脚本,可以将PostgreSQL数据库中的数据同步到另一个系统,该系统在我的测试/开发环境中执行,不会出现问题,使用: PostgreSQL 9.4 Npgsql dll版本3.0.3 在实时生产环境中运行脚本后,出现以下错误: “不支持时间戳的旧浮点表示形式” 在研究这个问题时,我发现这与“PostgreSQL的一个不推荐的编译时选项有关,该选项会切换到某些日期/时间字段的浮点表示形式。Npgsql(当前)不支持此模式。” 在生产环境中,PostgreSQL server

我编写了一个基本脚本,可以将PostgreSQL数据库中的数据同步到另一个系统,该系统在我的测试/开发环境中执行,不会出现问题,使用:

  • PostgreSQL 9.4
  • Npgsql dll版本3.0.3
在实时生产环境中运行脚本后,出现以下错误:

“不支持时间戳的旧浮点表示形式”

在研究这个问题时,我发现这与“PostgreSQL的一个不推荐的编译时选项有关,该选项会切换到某些日期/时间字段的浮点表示形式。Npgsql(当前)不支持此模式。”

在生产环境中,PostgreSQL server运行的是8.3版,由于内部原因,服务器管理器目前拒绝升级PostgreSQL server。(当前的Npgsql版本不正式支持9.doh之前的PosgreSQL!)

问题:

  • 有没有办法修改PostgreSQL 8.3“integer\u datetimes” 未完全重新安装应用程序的配置设置或 升级
  • 或者,有没有办法将我的Npgsql DLL降级到支持此配置设置的旧版本
  • 如有必要,对Npgsql的替代方案有何建议?我正在考虑重构代码以使用ADO.NET(但我不确定是否建议这样做)

    • 根据这里的一条线索:

      我注意到这可能对您有所帮助:

      “遵守以下不相容性”下列出的第一项 在8.4发行说明中:

      默认情况下使用64位整数日期时间(Neil Conway)

      以前,这是由配置的 --启用整数日期时间选项。要保留旧的行为,请使用--disable integer datetimes构建


      也许这有助于了解如何禁用/启用integer datetime。

      您使用的是哪个版本的Postgre SQL?

      对此我不是百分之百确定,但Npgsql 2.2.7应该能够正确使用PostgreSQL遗留浮点格式,因为它使用文本传输来读取和写入非二进制的值。这应该允许您与旧数据库交互

      但是,我们强烈反对继续以任何方式使用PostgreSQL 8.3—8.3于2013年2月到期。。。您当然应该尝试迁移到9.4,只需转储数据并将其恢复到新环境中,就可以了

      还要注意的是,虽然新版本(如3.0.4)通常可以在9.0之前的PostgreSQL上运行,但它们没有经过任何测试,我们可能不会修复您可能遇到的任何非常见错误

      Npgsql,ASP.NET Core 2.2:System.NotSupportedException:已弃用的 Npgsql不支持浮点日期/时间格式


      嗨,伙计们!我使用asp.net core 2.2解决了这个问题。就我而言,我降级到Npgsql版本4.0.7,这解决了我的问题。

      Hi Vinny,感谢您花时间调查并帮助我解决此问题。运行该任务的实时服务器正在使用PostgreSQL数据库服务器8.3。在我的开发环境中,我使用9.4。不幸的是,我认为没有任何方法可以在不升级的情况下更改PostgreSQL 8.3实例上的datime整数设置,目前服务器管理员说这不是一个选项。因此,我认为我需要使用与Npgsql(或旧的Npgsql DLL)不同的方法用于从数据库中提取我的数据集。您是否可以通过我提供的链接中的代码在9.4环境中设置遗留标志:
      build with--disable integer datetimes
      这是一种黑客行为,但是在将日期插入目标数据库之前将其转换为字符串,然后将这些字符串重新转换为它们应该使用的格式呢在。ADO.Net似乎可以很好地代替Npgsql处理此问题,而无需强制转换任何内容,但这只是一个想法。降级到Npgsql 2.2.7解决了我遇到的“不支持时间戳的旧浮点表示”错误。谢谢你的帮助!我完全同意使用POSGRESQL8.3并不理想,但不幸的是,在本例中,我无法控制升级与否,必须为PostgreSQL 8.3数据库找到一个可行的解决方案。好的一面是,我已经有了一份我的项目的副本,它在数据库升级时使用最新的Npgsql版本。再次感谢你!我有一个PostgreSQL 9.3实例,禁用了
      integer\u datetimes
      后无法控制。NPGSQL2.2.7适用于时间戳,但我认为有些数组抛出值类型数组中的null。升级到3.2.5修复了阵列,但现在时间戳抛出。为什么删除了时间戳支持(看起来可能是commit
      1f140e5
      )?没有删除时间戳支持-Npgsql 3.0从读取/写入值的文本表示转换为二进制,即不是解析人类可读的时间戳表示,而是读取一个简单的二进制值(更高效、更易于维护等)。不幸的是,在非常旧的PostgreSQL版本中,Npgsql不支持默认的二进制表示形式,尽管您仍然可以按照上面对新表示形式的解释重新编译。顺便说一句,除非我弄错了新的时间戳二进制格式(“64位整数日期时间”)很长一段时间以来一直是默认的,早在9.3之前。所以有人专门编译了您的PostgreSQL 9.3,以使用一种过时的时间戳格式。