使用Dapper(C#)调用PostgreSQL存储过程

1zmg4dgp  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(370)

我发布这篇文章有两个原因
1.我是PostgreSQL的新手,花了一段时间才把这些信息拼凑起来,所以我想其他人会觉得这很有帮助,
1.询问是否有其他方法可以调用PostgreSQL存储过程,而不需要在存储过程名称/签名中包含所有参数。
下面的代码使用Dapper和Npgsql来调用PostgreSQL存储过程,该过程插入(传入空id_inout)或更新记录(id_inout有值)。
我想了解为什么PostgreSQL在调用时需要整个存储过程的签名。

public static int? PO_Save(PurchaseOrder po)
    {

        int? recordId = null;           

        using (var cn = new NpgsqlConnection(AppSettings.ConnectionString))
        {
            if (cn.State != ConnectionState.Open)
                cn.Open();

            var procName = "CALL po_save(@in_ponumber,@in_deliverydate,@in_bldnum," +
                "@in_facname,@in_facnumber,@in_facaddress1,@in_facaddress2,@in_city," +
                "@in_state,@in_zip,@in_theme,@id_inout)";
            var p = new Dapper.DynamicParameters();
            p.Add("@in_ponumber", po.PONumber);
            p.Add("@in_deliverydate", po.DeliveryDate);
            p.Add("@in_bldnum", po.BldNum);
            p.Add("@in_facname", po.FacName);
            p.Add("@in_facnumber", po.FacNumber);
            p.Add("@in_facaddress1", po.FacAddress1);
            p.Add("@in_facaddress2", po.FacAddress2);
            p.Add("@in_city", po.City);
            p.Add("@in_state", po.State);
            p.Add("@in_zip", po.Zip);
            p.Add("@in_theme", po.Theme);
            p.Add("@id_out", po.POID, null, ParameterDirection.InputOutput);
            var res = cn.Execute(procName, p);
            recordId = p.Get<int>("@id_inout");
        }

        return recordId;
    }
xuo3flqw

xuo3flqw1#

您应该能够将commandType: CommandType.StoredProcedure传递到Execute,例如:

var res = cn.Execute(
    "po_save",
    new {
        in_ponumber = po.PONumber,
        in_deliverydate = po.DeliveryDate,
        // etc...
    },
    commandType: CommandType.StoredProcedure,
);

下面是这样一个例子的文档:https://github.com/StackExchange/Dapper/blob/main/Readme.md#stored-procedures

eufgjt7s

eufgjt7s2#

我想自己找到这个问题的答案,从Npgsql 7. 0开始,CommandType.StoredProcedure现在将调用存储过程,而不是像以前那样调用函数。

相关问题