使用C#/.Net与Npgsql无法读取PostgreSQL存储函数返回数据
解决Npgsql调用PostgreSQL返回SETOF自定义类型函数的问题
问题原因
- 调用方式错误:直接
SELECT getallusersv2()会返回单个复合类型字段(整个users对象作为一列),而非拆分后的表结构,Npgsql无法识别未注册的自定义复合类型(users),因此报OID未知错误。 - 结果格式不符:这种调用方式返回的不是用户预期的多行数据,而是一行包含函数名的复合对象,导致映射方法无有效数据可解析。
解决方案
方案1:修改SQL调用语句(推荐)
将调用语句改为从函数中展开结果集,让返回结构与查询users表完全一致:
var cmd = new NpgsqlCommand("SELECT * FROM getallusersv2()", conn); var reader = cmd.ExecuteReader();
此时reader会返回users表的所有列,你的结果映射方法可以正常解析每一行数据。
方案2:注册自定义复合类型(需实体类对应)
如果必须保留SELECT getallusersv2()的调用方式,需在Npgsql连接中注册users复合类型:
- 创建与PostgreSQL users表结构对应的C#实体类:
public class Users { public int Id { get; set; } // 其他属性与users表列一一对应 }
- 在打开数据库连接后注册类型:
conn.Open(); conn.TypeMapper.MapComposite<Users>("users"); // "users"是PostgreSQL中的复合类型名 var cmd = new NpgsqlCommand("SELECT getallusersv2()", conn); var reader = cmd.ExecuteReader(); while (reader.Read()) { var user = reader.GetFieldValue<Users>(0); // 处理user对象 }
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

