gpt4 book ai didi

c# - 如何通过在 npgsql 中调用存储过程来获取游标数据

转载 作者:行者123 更新时间:2023-11-30 13:10:18 29 4
gpt4 key购买 nike

我查看了 www.npgsql.org 中的 Material , 但找不到如何解决我的问题...

表,PostgreSQL

[City], [State]
"Austin", "TX"
"Houston", "TX"
"Los Angeles", "CA"
"San Diego", "CA"
"San Fransisco";"CA"
"St.Louis", "MO"

函数(存储过程),PostgreSQL

-- Procedure that returns a single result set (cursor) 
CREATE OR REPLACE FUNCTION show_cities() RETURNS refcursor AS $$
DECLARE
ref refcursor;
BEGIN
OPEN ref FOR SELECT city, state FROM cities;
RETURN ref;
END;
$$ LANGUAGE plpgsql;

代码,C#

using (NpgsqlConnection conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString))
{
conn.Open();
using (NpgsqlTransaction tran = conn.BeginTransaction())
{
using (var command = new NpgsqlCommand("show_cities", conn))
{
command.Transaction = tran;
command.CommandType = CommandType.StoredProcedure;
NpgsqlDataReader dr = command.ExecuteReader();

while (dr.Read())
str += dr.GetValue(0);

dr.Close();
}
tran.Commit();
}
}

这将返回“未命名的门户 1”,它是要获取的游标而不是数据,有什么方法可以将其转换为数据,例如 Austin、Houston、Los Angeles...

互联网上有一些关于此的帖子,但我不确定我做错了什么。

  • npgsql : ver3.0.3
  • c# : vs2012

(已添加)我发现这发生在 npgsql ver3.x 中,而在 ver2.x 中它与我的代码一起工作正常。获取游标的用法有什么变化吗?

(引用) http://www.sqlines.com/postgresql/npgsql_cs_result_sets

最佳答案

在 Shay 的帮助下,我弄清楚了如何在删除“dereferenced”功能后在 v3.x 中获取游标。我认为这方面没有太多好的例子,我希望这可以帮助人们节省搜索示例的时间。

您可以在 npgsql ver3.x 中执行此操作

<强>1。 CommandType.StoredProcedure(游标名称未定义)

conn.Open();
NpgsqlTransaction tran = conn.BeginTransaction();

NpgsqlCommand command = new NpgsqlCommand("show_cities", conn);
command.CommandType = CommandType.StoredProcedure;
command.ExecuteNonQuery();

command.CommandText = "fetch all in \"<unnamed portal 1>\"";
command.CommandType = CommandType.Text;

NpgsqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
// do what you want with data, convert this to json or...
Console.WriteLine(dr[0]);
}
dr.Close();

tran.Commit();
conn.Close();

<强>2。 CommandType.StoredProcedure(已定义游标名称)

conn.Open();
NpgsqlTransaction tran = conn.BeginTransaction();

NpgsqlCommand command = new NpgsqlCommand("select show_cities(@ref)", conn);
command.CommandType = CommandType.Text;
NpgsqlParameter p = new NpgsqlParameter();
p.ParameterName = "@ref";
p.NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Refcursor;
p.Direction = ParameterDirection.InputOutput;
p.Value = "ref";
command.Parameters.Add(p);
command.ExecuteNonQuery();

command.CommandText = "fetch all in \"ref\"";
command.CommandType = CommandType.Text;

NpgsqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
// do what you want with data, convert this to json or...
Console.WriteLine(dr[0]);
}
dr.Close();

tran.Commit();
conn.Close();

<强>3。 CommandType.Text(已定义游标名称)

conn.Open();
NpgsqlTransaction tran = conn.BeginTransaction();

NpgsqlCommand command = new NpgsqlCommand("select show_cities(@ref)", conn);
command.CommandType = CommandType.Text;
NpgsqlParameter p = new NpgsqlParameter();
p.ParameterName = "@ref";
p.NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Refcursor;
p.Direction = ParameterDirection.InputOutput;
p.Value = "ref";
command.Parameters.Add(p);
command.ExecuteNonQuery();

command.CommandText = "fetch all in \"ref\"";
command.CommandType = CommandType.Text;

NpgsqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
// do what you want with data, convert this to json or...
Console.WriteLine(dr[0]);
}
dr.Close();

tran.Commit();
conn.Close();

(v2.x 引用)http://www.sqlines.com/postgresql/npgsql_cs_result_sets

这是为了便于理解的例子,所以如果你希望你的函数返回单个结果集,那么不要返回cursor,请考虑返回table作为@ Shay 建议或创建一个 view 而不是 @CeOnSql 建议的 function

谢谢!

关于c# - 如何通过在 npgsql 中调用存储过程来获取游标数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32862416/

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