带参数的 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 也会很好,一些关于sqlparam 是什么 - 也许是 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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

C# Dapper缓存问题?

使用没有字母参数的 Postgresql 的 Dapper 存储过程

Dapper 多参数存储过程查询不会从数据库返回任何内容

如何使用 Dapper 将 list<myobject> 作为参数插入到存储过程

Dapper:过程或函数指定了太多参数

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