当尝试使用Npgsql (v. 3.1.7)检索元组时,我得到了各种结果。
整数元组似乎可以工作:
SELECT (1, 2)
返回一个包含整数1和2的对象数组。
但是对于其他数据类型,我得到不同类型的失败:
SELECT (1, 'two')
有了这个,我得到一个NpgsqlException与文本Unknown message code: 0
。
SELECT (1, 2, 'three')
同样的事情,但这一次,未知的消息代码是101
。这是'e'
的ASCII值,如果我在末尾加上'f'
('threef'
),那么代码就是102
。
SELECT (1, 2, 3, 'four')
这次我得到一个对象数组,其中包含整数1、2、3和1718580594。最后一个是0x666F7572。"0x66
"、"0x6F
"、"0x75
"、"0x72
"分别为'f'
、'o'
、'u'
、'r'
的ASCII值。
SELECT ('one', 2)
挂起并最终超时。
在使用ExecuteReader时(在填充数据集时也可重现),我得到了一个带有内部EndOfStreamException的NpgsqlException,但我找不到一个简单的重现来发布。
这些只是bug在Npgsql,还是我做错了什么?
是的,这是一个但是在Npgsql源代码。我通过它调试,有一个相当有趣的错误。Npgsql读取元组项类型为int ,但类型映射器期望int 。它还有一个对象的索引器,这就是代码的引导。这会导致它尝试将所有内容读取为整型。
我会提交一个补丁到Npgsql,但如果你想修复它自己的某种原因,只是去TypeHandlersRecordHandler.cs,方法读取(出对象[]结果)和修复这一行(86在当前的开发分支):
var typeOID = _readBuf.ReadUInt32();
在当前源代码中,ReadInt32()
导致了这个问题。
在我修复了这个问题后,我可以使用GetValue()
并获得一个对象数组与int,文本等,但我想。
这些都是Npgsql中的bug——实际上很可能所有这些情况都源于一个bug。你能在http://github.com/npgsql/npgsql上为这些打开一个问题吗?
对于记录,在PostgreSQL中SELECT (1, 2)
不是返回一个数组,而是返回一个记录。数组是可以用SELECT '{1, 2}'::INTEGER[]
返回的另一种数据类型。