2015-12-14 38 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