2015-12-14 46 views
2

我已经写了从PostgreSQL数据库到另一个系统,其执行没有问题,我的测试/开发环境,使用同步数据提供了基本的脚本:Npgsql的:不支持时间戳旧的浮点表示

  • PostgreSQL的9.4
  • DLL Npgsql的版本3.0.3

一旦我们跑在现场生产环境的脚本,我们打以下错误:

"Old floating point representation for timestamps not supported"

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

Here is a link to the relevant source code

在生产中,PostgreSQL服务器正在运行8.3版本,而对于内部原因,服务器管理器已下降到PostgreSQL服务器在这个时候升级(Npgsql的当前版本不正式支持PosgreSQL之前的版本9 DOH!)

问题(S):

  • 有什么办法修改的PostgreSQL 8.3 “integer_datetimes” 的conf没有完全重新安装应用程序或 升级?
  • 或者,有没有办法将我的Npgsql dll降级到支持此配置设置的旧版本?
  • 如有必要,还有其他Npgsql替代方法的建议吗?我正在考虑重构代码以使用ADO.NET(但我不确定是否会推荐)。

回答

0

我对此并不百分百确定,但Npgsql 2.2.7应该能够使用PostgreSQL传统的浮点格式正常工作,因为它使用文本传输来读写值而不是二进制文件。这应该允许您与旧数据库进行交互。

但是,以任何方式继续使用PostgreSQL 8.3是非常令人沮丧的 - 8.3在2013年2月达到了其使用寿命结束时的状态......您应该尝试迁移到9.4,只需转储数据并将其恢复到新的环境,它可能运作良好。

另外请注意,虽然新版本,如3.0.4,一般在9.0之前的PostgreSQL上工作 - 它只是它们没有以任何方式测试,我们可能不会修复任何不重要的错误可能会碰到。

+0

降级到Npgsql 2.2.7解决了我遇到的错误“不支持时间戳的旧浮点表示”错误。感谢您的帮助!我完全同意使用PosgreSQL 8.3并不理想,但在这种情况下,我不幸没有任何控制权决定是否升级,并且必须为PostgreSQL 8.3数据库找到一个可行的解决方案。好的一面是,我已经有了一个使用最新Npgsql版本的项目的副本,可以在数据库升级时进行升级。再次感谢你! –

+0

我有一个PostgreSQL 9.3实例,我不控制'integer_datetimes'禁用。 Npgsql 2.2.7适用于时间戳,但是一些数组抛出时,我认为应该使用值类型数组中的空值。升级到3.2.5固定了阵列,但现在时间戳丢失了。为什么删除了时间戳记支持(看起来可能提交'1f140e5')? – ryachza

+0

时间戳支持未被删除 - Npgsql 3.0从读/写值的文本表示切换到二进制,即不是解析人类可读的时间戳表示,而是读取一个简单的二进制值(更高效,更易于维护等)。 )。不幸的是,在非常旧的PostgreSQL版本中,Npgsql不支持默认的二进制表示形式,尽管您仍然可以像上面解释的那样重新编译新的表示形式。 –

0

根据线索在这里:

http://grokbase.com/t/postgresql/pgsql-general/103f2g9gsr/integer-datetime-8-2-8-4-differences

我注意到这一点,可能对你有帮助:

The first item listed under "Observe the following incompatibilities" in the 8.4 release notes is

Use 64-bit integer datetimes by default (Neil Conway)

Previously this was selected by configure's --enable-integer-datetimes option. To retain the old behavior, build with --disable-integer-datetimes.

也许这就是搞清楚有益如何禁用/启用整数-约会时间。

你在什么版本的Postgre-SQL?

+0

嗨温尼,感谢您花时间调查并帮助我解决此问题。运行该任务的在线服务器正在使用PostgreSQL数据库服务器8.3。在我的开发环境中,我使用了9.4。不幸的是,我不认为有什么方法可以在不升级的情况下更改PostgreSQL 8.3实例上的datime整数设置,目前服务器管理员已经表示这不是一个选项。所以我认为我需要使用与Npgsql(或更旧的Npgsql dll)不同的方法来从数据库中提取数据集。 –

+0

您可以通过我提供的链接中的代码在9.4环境中设置遗留标志: '使用--disable-integer-datetimes'构建 这是一种破解,但是在插入它们之前如何将日期转换为字符串呢?到目标数据库,然后重新将这些字符串重新制作成任何格式。 ADO.Net似乎可以很好地代替Npgsql来处理这个问题,而不需要进行任何操作,但它只是一个想法。 – VinnyGuitara