2016-08-13 99 views
2

嘗試使用Npgsql檢索元組時,我會得到各種結果(v.3.1.7)。Npgsql支持哪些元組?

整數的元組似乎好工作:

SELECT (1, 2) 

這返回包含整數1和2。

但與其他的數據類型的對象陣列,我得到不同類型的故障:


SELECT (1, 'two') 

有了這個,我得到的文本的NpgsqlException。


SELECT (1, 2, 'three') 

同樣的事情,但是這一次,未知的消息代碼爲101。這是'e'的ASCII值,並且如果我將'f'拖到末尾('threef'),則代碼是102


SELECT (1, 2, 3, 'four') 

這次我得到含有整數1,2,3的對象陣列,並且1718580594.這最後是0x666F7572。 0x66,0x6F,0x750x72'f''o''u''r'的ASCII值。


SELECT ('one', 2) 

此掛起並最終超時。


在一個點(填充數據集時也可重複)使用的ExecuteReader時,我買了一個內EndOfStreamException的NpgsqlException,但我無法找到一個簡單的攝製張貼的那一個。


這些只是Npgsql的錯誤,還是我做錯了什麼?

回答

1

這些是Npgsql中的錯誤 - 很可能所有這些情況實際上都是由一個錯誤引起的。你可以請打開http://github.com/npgsql/npgsql上的這些問題嗎?

爲了記錄,用PostgreSQL的說法SELECT (1, 2)不返回數組,它返回一條記錄。數組是與SELECT '{1, 2}'::INTEGER[]一起返回的不同數據類型。

+0

謝謝,謝謝。是的,我理解Postgres中的元組/記錄與數組的區別,但是由於我的第一次使用'SELECT(1,2)'的測試返回了一個對象數組,我認爲對象數組是Npgsql用來表示PostgreSQL的元組的類型,對我來說合理。 –

+0

我將提交修正此問題的拉取請求,以通知Shay –

+0

該修復程序適用於我的測試用例和我的實際用例。謝謝,謝伊和薩米! –

2

是的,它是一個但在Npgsql的來源。我通過它進行調試,並且有一個相當有趣的錯誤。 Npgsql將元組項類型讀取爲整數,但類型映射程序需要請求。它也有一個對象的索引器,這就是代碼引導的地方。這導致它嘗試讀取所有內容。

我會向Npgsql提交一個補丁,但如果您想由於某種原因自己修復它,只需轉到TypeHandlers \ RecordHandler。CS,方法Read(out對象[]結果)和修正此線(86當前dev的分支):

var typeOID = _readBuf.ReadUInt32(); 

在它具有ReadInt32()這使得這一問題的電流源。

當我解決這個問題後,我可以使用GetValue()並獲得一個對象數組與intts,文本等,但我想。

+1

幹得好,我只是自己修復它:)我正在等待實際問題被打開並將提交。 –