Dapper Postgres хранимая процедура с параметром - PullRequest
0 голосов
/ 13 марта 2019
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)

что не так.

1 Ответ

0 голосов
/ 01 апреля 2019

Даппер, похоже, не является проблемой здесь. Для выполнения хранимой процедуры в 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

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

...