gpt4 book ai didi

c# - 如何使用 postgresql 函数获取多结果集

转载 作者:行者123 更新时间:2023-11-29 13:14:40 26 4
gpt4 key购买 nike

我想用函数返回多个结果集。但是 reader.NextResult() 不起作用。查询结果如下

"<unnamed portal 1>"
"<unnamed portal 2>"

函数(存储过程),PostgreSQL

CREATE OR REPLACE FUNCTION public.sp_get_multiviewlist
( )
RETURNS SETOF refcursor
DECLARE
ref1 refcursor;
ref2 refcursor;
BEGIN
OPEN ref1 FOR
SELECT * FROM public."Customer";
RETURN NEXT ref1;

OPEN ref2 FOR
SELECT * FROM public."Order";
RETURN NEXT ref2;

END;

$$ LANGUAGE plpgsql;

其他数据库运行正常。我该怎么做?

npgsql : ver 3.2.5

最佳答案

使用 setof refcursor是一种可以在 PG 中模拟多个结果集的方法。但它实际上与多个结果集不是一回事。

Npgsql 过去常常自动获取从存储过程返回的游标的内容,但这也不总是期望的,所以它被删除了。在 this github issue 阅读整个(长篇)讨论.

无论如何,要获取数据你必须执行FETCH ALL FROM "<unnamed portal 1>" - unnamed portal 1 在哪里必须是从存储过程返回的字符串。只有在事务内执行存储过程时,游标才会保持足够长的时间。

你可以看看 Npgsql 以前是怎么做的 here ,或遵循以下一般方法:

using(var trans = db.BeginTransaction())
using(var cmd = db.CreateCommand()) {
cmd.CommandText = "sp_get_multiviewlist";
cmd.CommandType = CommandType.StoredProcedure;

string cursor1Name,cursor2Name;
using (var reader = cmd.ExecuteReader())
{
reader.Read();
cursor1Name = reader.GetString(0);
reader.Read();
cursor2Name = reader.GetString(0);
}


using(var resultSet1 = db.CreateCommand())
{
resultSet1.CommandText = $@"FETCH ALL FROM ""{cursor1Name}""";
using (var reader = resultSet1.ExecuteReader())
{
while (reader.Read())
{
// Do something with the customer row
}
}
}

using (var resultSet2 = db.CreateCommand())
{
resultSet2.CommandText = $@"FETCH ALL FROM ""{cursor2Name}""";
using (var reader = resultSet2.ExecuteReader())
{
while (reader.Read()) {
// Do something with the order row
}
}
}
}

关于c# - 如何使用 postgresql 函数获取多结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50643178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com