带参数的 Dapper Postgres 存储过程
Posted
技术标签:
【中文标题】带参数的 Dapper Postgres 存储过程【英文标题】:Dapper Postgres stored procedure with parameter 【发布时间】:2019-03-13 09:48:29 【问题描述】:try
return Connection.QuerySingleOrDefault<T>(sql, param, _transaction,
commandType: CommandType.StoredProcedure);
catch (Exception orig)
var ex = new Exception($"Dapper proc execution failed!", orig);
AddDetailsToException(ex, sql, param);
throw ex;
使用 SQL:
CREATE OR REPLACE PROCEDURE public."GetChildBank"(
"bankId" integer DEFAULT NULL::integer)
LANGUAGE 'sql'
AS $BODY$
)
select * from cte where ParentBank is not null
and "Id" <> "bankId"
$BODY$;
我正在使用 Dapper 和 PostgreSQL 并使用存储过程来获取数据 但它总是抛出错误。
转换成 SQL 语句
SELECT *
FROM "GetChildBank"("bankId" := $1)
这是错误的。
【问题讨论】:
"但它总是出错" - 什么错误?param
在这里看起来像什么? 大概sql
是一个存储过程的名字,在这种情况下:上面定义了哪些参数?
请edit您的问题(点击下面的edit链接)并将您的存储过程(或函数)的代码添加为formatted text , no screen shots
详细说明-我几乎可以肯定在这里提供帮助(我是主要的简洁作者/维护者),但是:我不是通灵者。您将不得不通过告诉我至少orig.Message
所说的内容来帮助我。任何其他细节也会很有用,但orig.Message
是绝对最小值 我需要在这里有机会(在一个完美的世界中:orig.GetType().Name
也会很好,一些关于sql
和 param
是什么 - 也许是 T
也是)
@MarcGravell sql 是存储过程名称,param 是存储过程的参数
重新编辑:It converts into sql a statement SELECT * FROM "GetChildBank"("bankId" := $1) which is wrong
- 不,这根本不是 dapper 所做的事情。它不会将任何东西转换成任何东西。所以;让我们退后一步:这里的sql
是什么?大概sql
是"GetChildBank"
?大概param
看起来像new bankId = 130134
?现在:实际发生了什么? orig.Message
是什么?
【参考方案1】:
Dapper 似乎不是这里的问题。要在 postgresql 中使用参数执行存储过程,它应该是
using (var connection = new NpgsqlConnection("Host=localhost;Username=postgres;Password=root;Database=sample"))
connection.Open();
var sql = "CALL \"GetChildBank\"(@bankId)";
var p = new DynamicParameters();
p.Add("@bankId", 11);
var res = connection.Execute(sql, p);
要创建一个返回行集的函数并从select中调用它,您需要使用create function
CREATE OR REPLACE FUNCTION ""GetChildBank"("bankId" integer) RETURNS SETOF cte AS $$
SELECT * FROM cte where "ParentBank" IS NOT NULL AND "Id" <> $1;
$$ LANGUAGE sql;
https://www.postgresql.org/docs/11/sql-createfunction.html
【讨论】:
以上是关于带参数的 Dapper Postgres 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
使用没有字母参数的 Postgresql 的 Dapper 存储过程