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

如何在C#中调用返回JSON的PostgreSQL存储过程?

在C#中调用PostgreSQL返回游标的存储过程

我来帮你搞定这个调用的问题!要在C#里调用你写的这个返回refcursor的存储过程,咱们用PostgreSQL官方的.NET驱动Npgsql来实现,步骤很清晰:

1. 先安装Npgsql包

首先得确保你的项目里安装了Npgsql,这是连接PostgreSQL的必备驱动。你可以通过NuGet包管理器搜索安装,或者用命令行:

dotnet add package Npgsql

2. 完整的C#调用代码示例

下面是完整的调用代码,我会一步步解释关键点:

using Npgsql;
using System;
using System.Text.Json;

class Program
{
    static void Main()
    {
        // 替换成你的PostgreSQL连接字符串
        string connectionString = "Host=your_host;Username=your_user;Password=your_password;Database=your_db";

        using var conn = new NpgsqlConnection(connectionString);
        conn.Open();

        // 敲黑板:PostgreSQL的游标必须在事务上下文里使用,所以一定要开启事务
        using var tx = conn.BeginTransaction();

        try
        {
            // 创建命令,指定调用存储过程
            using var cmd = new NpgsqlCommand("get_data_test", conn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            // 执行命令,获取返回的游标
            var cursor = (NpgsqlDataReader)cmd.ExecuteReader();

            // 现在读取游标里的JSON数据
            while (cursor.Read())
            {
                // 获取JSON字符串
                string jsonData = cursor.GetString(0);
                // 如果你需要把JSON反序列化成对象,可以这样做
                // var dataObject = JsonSerializer.Deserialize<YourDataClass>(jsonData);
                Console.WriteLine(jsonData);
            }

            // 关闭游标,提交事务
            cursor.Close();
            tx.Commit();
        }
        catch (Exception ex)
        {
            // 出错回滚事务
            tx.Rollback();
            Console.WriteLine($"调用出错:{ex.Message}");
        }
    }
}

3. 关键注意点

  • 事务必须开启:PostgreSQL的refcursor是依赖事务的,没有事务的话游标无法正常工作,所以一定要用BeginTransaction()开启事务,最后记得提交或回滚。
  • 命令类型设置:一定要把CommandType设为StoredProcedure,这样Npgsql会正确解析存储过程调用。
  • 读取游标数据:执行ExecuteReader()后得到的NpgsqlDataReader就是游标对应的结果集,直接读取即可。如果你的JSON需要转成实体类,只需要用JsonSerializer反序列化就行(记得替换成你自己的实体类)。

你的存储过程代码参考:

-- 返回单个结果集(游标)的存储过程
CREATE OR REPLACE FUNCTION get_data_test() RETURNS refcursor AS $$
DECLARE
    ref refcursor; -- 声明游标变量
BEGIN
    OPEN ref FOR -- 打开游标
        SELECT row_to_json(r) AS data FROM ( SELECT * FROM data AS d ) r;
    RETURN ref; -- 返回游标
$$ LANGUAGE plpgsql;

内容的提问来源于stack exchange,提问作者Tristan Rhodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:20