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

标签 c# npgsql

我查看了 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/

相关文章:

c# - 在 C# 中通过驱动类 B 对象访问基类 A 函数

c# - 从 Compact Framework 客户端进行 REST 调用时如何避免 "Bad Request - Invalid Hostname"错误?

c# - Selenium Web Driver 点击

vb.net - Npgsql 可以转储/恢复整个数据库吗?

c# - asp net core app出现MSB3277怎么办

c# - 在反序列化期间解析 JSON 属性

c# - 使用 HttpWebRequest 通过 PUT 上传文件时出错

c# - NpgsqlDataReader - 将空值与 "NULL"文字区分开来

c# - 使用 C# 和 Npgsql 快速插入父表和子表

entity-framework - 在 Ubuntu 上的 MonoDevelop 中使用 EntityFramework 的 PostgreSQL