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。 0x66
、0x6F
、0x75
、0x72
是'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()
并根据需要获取包含整数、文本等的对象数组。
我在尝试使用 Npgsql (v. 3.1.7) 检索元组时得到各种结果。
整数元组似乎工作正常:
SELECT (1, 2)
这个 returns 一个包含整数 1 和 2 的对象数组。
但是对于其他数据类型,我遇到了不同类型的失败:
SELECT (1, 'two')
有了这个,我得到了一个带有文本 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'
、[=的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()
并根据需要获取包含整数、文本等的对象数组。