如何在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
相关产品推荐
相关产品推荐

