尝试使用Npgsql(v.3.1.7)检索元组时,我得到了各种结果。
整数元组似乎没问题:
SELECT (1, 2)
返回包含整数1和2的对象数组。
但是对于其他数据类型,我会遇到各种类型的失败:
SELECT (1, 'two')
有了这个,我得到一个带有文本Unknown message code: 0
的NpgsqlException。
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'
和{{的ASCII值1}}。
'r'
这会挂起并最终超时。
在使用ExecuteReader时(在填充数据集时也可重现),我得到了一个带有内部EndOfStreamException的NpgsqlException,但我找不到一个简单的repro来发布那个。
这些只是Npgsql中的错误,还是我做错了什么?
答案 0 :(得分:2)
是的,它是一个但是在Npgsql源代码中。我通过它进行了调试,并且有一个非常有趣的错误。 Npgsql将元组项类型读取为 ints ,但类型映射器需要 uints 。它还有一个对象的索引器,这是代码引导的地方。这导致它尝试以整数形式读取所有内容。
我将向Npgsql提交一个补丁但是如果你想由于某种原因自己修复它,只需转到TypeHandlers \ RecordHandler.cs,方法Read(out object [] result)并修复此行(当前dev分支中的86) ):
var typeOID = _readBuf.ReadUInt32();
在当前来源中,它有ReadInt32()
导致此问题。
在我修复了这个之后,我可以使用GetValue()
并获得一个包含整数,文本等的对象数组,但是我想要。
答案 1 :(得分:1)
这些是Npgsql中的错误 - 所有这些情况很可能源于一个错误。你能否在http://github.com/npgsql/npgsql上为这些问题打开一个问题?
对于记录,在PostgreSQL中,用语SELECT (1, 2)
不返回数组,它返回一条记录。数组是一种不同的数据类型,可以使用SELECT '{1, 2}'::INTEGER[]
返回。