带有postgres的存储过程中的Refcursor

时间:2017-12-25 02:49:40

标签: npgsql

我是postgres数据访问api的新手/新手。我已经在oracle,sql server上做了一些工作,并尝试做我用dbms做的事情 使用非常简单 1)存储过程aka输入参数的函数 2)返回或更多ref refrsrs 3)使用ent lib包装器使用npgsql提供程序/数据库 4)做一个数据适配器填充并运行一些光标取消引用的问题..它出现虽然我在一个tran .. 5)我只想用最新的npgsql提供程序获得一些简单的工作示例..

这是我的功能

CREATE OR REPLACE FUNCTION public.geterrorcategories(
    v_organizationid integer)
    RETURNS refcursor
    LANGUAGE 'plpgsql'

AS $BODY$

DECLARE cv_1 refcursor;
BEGIN 

    open cv_1 for
    SELECT errorCategoryId, name, bitFlag
    FROM ErrorCategories
    ORDER BY name;

 RETURN cv_1;


END;

$BODY$;

使用企业lib api / wrapper的代码如下。

   /// <summary>
    /// Executes GetErrorCategories in case of SQL Server or GetErrorCategories for Oracle
    /// </summary>
    public static DataTable GetErrorCategoriesAsDataTable(string dbKey  ,int? ORGANIZATIONID)
    {
        DataTable tbl = new DataTable();
        Database db = Helper.GetDatabase(dbKey);
        using (DbConnection con = db.CreateConnection()){
                con.Open();
                var tran = con.BeginTransaction();

            using (DbCommand cmd = con.CreateCommand()){
                    cmd.Transaction = tran;
                BuildGetErrorCategoriesCommand(db, cmd ,ORGANIZATIONID);

                cmd.CommandText = "GetErrorCategories";
                try {

                    Helper.FillDataTable(tbl, db, cmd);
                    con.Close();
                } catch (DALException ) {
                    throw;
                }
            }
        }
        return tbl;
    } 

该命令构建如下。

private static void BuildGetErrorCategoriesCommand(Database db, DbCommand cmd ,int? ORGANIZATIONID){
        Helper.InitializeCommand(cmd, 300, "GetErrorCategories"); 
            db.AddReturnValueParameter(cmd);

        db.AddInParameter(cmd, "organizationId", DbType.Int32, ORGANIZATIONID);

       db.AddCursorOutParameter(cmd, "CV_1");



    }

我没有收到任何错误。我只返回1行,我认为这是un_named_portal_1或者其他东西,但不是我的查询返回的表格中的结果

令人沮丧的是,我希望尽可能保持我的应用程序代码相同,但希望在运行时切换提供程序。我正在使用为npgsql创建的经过调整的'ent lib'贡献数据库。

希望这有助于指出我需要寻找的合适区域..

1 个答案:

答案 0 :(得分:0)

上面没有理由声明你的PostgreSQL函数返回一个游标 - 你只需返回一个表,参见the PostgreSQL docs for more info

Npgsql最初有一个功能,它自动&#34; dereferenced&#34;从函数返回的游标,但已被删除。有关详细信息,请参阅this issue(警告,它很长......)。有些人要求退回该功能。