Npgsql 支持哪些类型的元组?

What kinds of tuples does Npgsql support?

我在尝试使用 Npgsql (v. 3.1.7) 检索元组时得到各种结果。

整数元组似乎工作正常:

SELECT (1, 2)

这个 returns 一个包含整数 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值28=].


SELECT ('one', 2)

这会挂起并最终超时。


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


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

这些是 Npgsql 中的错误 - 很可能所有这些情况实际上都源于一个错误。你能在 http://github.com/npgsql/npgsql 上为这些打开一个问题吗?

郑重声明,用 PostgreSQL 的说法 SELECT (1, 2) 不是 return 数组,它 return 是一条记录。数组是一种不同的数据类型,可以 return 与 SELECT '{1, 2}'::INTEGER[]

是的,它是一个但是在 Npgsql 源中。我调试了它,发现了一个非常有趣的错误。 Npgsql 将元组项类型读取为 ints,但类型映射器期望 uints。它还具有 objects 的索引器,这就是代码引导的地方。这导致它尝试将所有内容都读取为整数。

我会向 Npgsql 提交补丁,但如果你出于某种原因想自己修复它,只需转到 TypeHandlers\RecordHandler.cs,方法 Read(out object[] result) 并修复此行 (86在当前开发分支中):

var typeOID = _readBuf.ReadUInt32();

在当前源中有 ReadInt32() 导致了这个问题。

修复此问题后,我可以使用 GetValue() 并根据需要获取包含整数、文本等的对象数组。