2015-12-14 4 views
2

Я написал базовый сценарий, который синхронизирует данные из базы данных PostgreSQL в другую систему, которая выполняет в моей тестовой/среде разработки без проблем, с использованием:Npgsql: Старое плавающая точка представление для временных меток не поддерживается

  • PostgreSQL 9.4
  • 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!)

Вопрос (ы):

  • есть ли способ изменить PostgreSQL 8.3 "integer_datetimes" конф iguration без полной переустановки приложения или обновления ?
  • Альтернативно, есть ли способ понизить мои DLL-файлы Npgsql до более старой версии, где этот параметр конфигурации был поддержан?
  • Какие-либо рекомендации по альтернативе Npgsql, если необходимо? Я думал о реорганизации кода для использования ADO.NET (но я не уверен, что это было бы рекомендовано).

ответ

0

Я не уверен в этом на сто процентов, но Npgsql 2.2.7 должен иметь возможность корректно работать с прежним форматом плавающей запятой PostgreSQL, поскольку он использует перенос текста для чтения и записи значений, а не двоичных. Это должно позволить вам взаимодействовать со старой базой данных.

Тем не менее, настоятельно рекомендуется продолжать использовать PostgreSQL 8.3 в любом случае - 8.3 достиг своего конца жизни в феврале 2013 года ... Вы должны поэкспериментировать с переносом на 9.4 просто путем сброса данных и восстановления их в новая среда, она может работать хорошо.

Также обратите внимание, что в то время как новые версии, такие как 3.0.4, вообще работают на pre-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.

Может быть, это полезно в выяснить, как отключить/включить целое число -datetime.

Какая версия Postgre-SQL включена?

+0

Привет, Винни, Спасибо, что нашли время для расследования и помощи в устранении этой проблемы. Живой сервер, на котором запущена задача, использует PostgreSQL Database Server 8.3. В моей среде разработки я использую 9.4. К сожалению, я не думаю, что мне не удастся изменить параметр целого числа datime на экземпляре PostgreSQL 8.3 без обновления, и в настоящее время администратор сервера сказал, что это не вариант. Поэтому я думаю, что мне нужно использовать другой метод, чем Npgsql (или более старые DLL-файлы Npgsql) для вытягивания моего набора данных из БД. –

+0

Не могли бы вы установить флаг устаревшего в среду 9.4 через код в ссылке, которую я предоставил: 'build with --disable-integer-datetimes' Это взломать, но как насчет того, чтобы ввести даты как строки, прежде чем вставлять их в целевую БД, а затем переделать эти строки обратно в любой формат, в котором они должны быть. ADO.Net кажется, что он будет обрабатывать это для вас красиво вместо Npgsql, не бросая ничего, но это была просто мысль. – VinnyGuitara