You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#/.Net与Npgsql无法读取PostgreSQL存储函数返回数据

解决Npgsql调用PostgreSQL返回SETOF自定义类型函数的问题

问题原因

  1. 调用方式错误:直接SELECT getallusersv2()会返回单个复合类型字段(整个users对象作为一列),而非拆分后的表结构,Npgsql无法识别未注册的自定义复合类型(users),因此报OID未知错误。
  2. 结果格式不符:这种调用方式返回的不是用户预期的多行数据,而是一行包含函数名的复合对象,导致映射方法无有效数据可解析。

解决方案

方案1:修改SQL调用语句(推荐)

将调用语句改为从函数中展开结果集,让返回结构与查询users表完全一致:

var cmd = new NpgsqlCommand("SELECT * FROM getallusersv2()", conn);
var reader = cmd.ExecuteReader();

此时reader会返回users表的所有列,你的结果映射方法可以正常解析每一行数据。

方案2:注册自定义复合类型(需实体类对应)

如果必须保留SELECT getallusersv2()的调用方式,需在Npgsql连接中注册users复合类型:

  1. 创建与PostgreSQL users表结构对应的C#实体类:
public class Users
{
    public int Id { get; set; }
    // 其他属性与users表列一一对应
}
  1. 在打开数据库连接后注册类型:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:37:15