Npgsql支持哪些类型的元组?

时间:2016-08-13 17:19:41

标签: npgsql

尝试使用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。 0x660x6F0x750x72'f''o''u'和{{的ASCII值1}}。

'r'

这会挂起并最终超时。

在使用ExecuteReader时(在填充数据集时也可重现),我得到了一个带有内部EndOfStreamException的NpgsqlException,但我找不到一个简单的repro来发布那个。

这些只是Npgsql中的错误,还是我做错了什么?

2 个答案:

答案 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[]返回。