C# Npgsql 从过程输出参数读取游标

C# Npgsql read cursor from procedure output parameter

我正在将应用程序从 Oracle 数据库迁移到 Postgres 数据库。 有许多程序通过输出参数 a RefCursor returns 实现。就像这样:

        string schema = server.SERVER_SCHEMA;
        string connStr = modelUtils.GetRemoteConn(server, false);

        OracleConnection conn = GetConnection(connStr);
        OracleCommand cmd = GetCommand(conn);

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = schema + ".ProcedureName";
        cmd.Parameters.Add("p_flow", OracleDbType.Varchar2, ParameterDirection.Input).Value = flowKey;
        OracleParameter outCursor = cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor, ParameterDirection.Output);
        cmd.ExecuteNonQuery();
        OracleRefCursor dataCursor = (OracleRefCursor)outCursor.Value;

        OracleDataAdapter myAdapter = new OracleDataAdapter("", conn);
        myAdapter.Fill(tableData, dataCursor);

请注意,我必须获取参数 outCursor,转换为 OracleRefCursor 并将其设置为名为“tableData" 通过 DataAdapter.

做同样的事情,但使用 Npgsql 这是我的方法:

        string schema = server.SERVER_SCHEMA;
        string connStr = modelUtils.GetRemoteConn(server, false);

        NpgsqlConnection conn = GetConnection(connStr);
        NpgsqlCommand cmd = GetCommand(conn);

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = schema + ".ProcedureName";
        cmd.Parameters.Add("p_flow", NpgsqlDbType.Varchar).Value = flowKey;
        NpgsqlParameter outCursor = cmd.Parameters.Add(new NpgsqlParameter("p_cursor", NpgsqlDbType.Refcursor) { Direction = ParameterDirection.Output });
        cmd.ExecuteNonQuery();
        var dataCursor = (Refcursor)outCursor.Value;

        NpgsqlDataAdapter myAdapter = new NpgsqlDataAdapter("", conn);
        myAdapter.Fill(tableData, dataCursor);

但不幸的是,Npgsql 中似乎没有 Refcursor

的等价物

有什么办法可以解决这个问题吗?

谢谢。

对于所有需要做同样事情的人,我建议阅读这篇文章:

尽管如此,我还是这样解决了这个问题:

NpgsqlConnection conn = GetConnection(connStr);
NpgsqlCommand cmd = new NpgsqlCommand("CALL show_citiesProc('op');FETCH ALL IN \"op\";", conn);
NpgsqlDataAdapter myAdapter = new NpgsqlDataAdapter(cmd);
myAdapter.Fill(tableData);
myAdapter.Dispose();