我发布这篇文章有两个原因
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;
}
2条答案
按热度按时间xuo3flqw1#
您应该能够将
commandType: CommandType.StoredProcedure
传递到Execute
,例如:下面是这样一个例子的文档:https://github.com/StackExchange/Dapper/blob/main/Readme.md#stored-procedures
eufgjt7s2#
我想自己找到这个问题的答案,从Npgsql 7. 0开始,CommandType.StoredProcedure现在将调用存储过程,而不是像以前那样调用函数。