使用 Npgsql 7 执行函数

问题描述 投票:0回答:2

我正在运行 PostgreSQL 15 并将 Dapper 和 Npgsql 7.0 添加到我的项目中。我需要运行以下函数:

CREATE OR REPLACE FUNCTION get_all_posts(
    start_date date default null,
    end_date date default null,
    user_id integer default null,
    take_rows integer default 10,
    skip_rows integer default 0)
 RETURNS SETOF post_info
 LANGUAGE plpgsql
AS $function$
BEGIN
    RETURN QUERY SELECT .....
END;
$function$
;

然后我尝试了以下 C# 代码来执行此查询并返回结果集:

using (var reader = await connection.ExecuteReaderAsync("get_all_posts", 
                   new
                   {
                       start_date = postRequest.StartDate as object ?? DBNull.Value,
                       end_date = postRequest.EndDate as object ?? DBNull.Value,
                       user_id = postRequest.UserId as object ?? DBNull.Value,
                       take_rows = take,
                       skip_rows = skip,
                   }, commandType: CommandType.StoredProcedure))
{
// ...
}

这会导致错误指出 get_all_posts 不是过程(Npgsql 7.0 停止接受函数的

CommandType.StoredProcedure
)。

然后尝试使用这样的 SELECT 语句:

using (var reader = await connection.ExecuteReaderAsync("SELECT * FROM get_all_posts($1, $2, $3, $4, $5)", 
                   new
                   {
                       start_date = postRequest.StartDate as object ?? DBNull.Value,
                       end_date = postRequest.EndDate as object ?? DBNull.Value,
                       user_id = postRequest.UserId as object ?? DBNull.Value,
                       take_rows = take,
                       skip_rows = skip,
                   }, commandType: CommandType.Text))
{
// ...
}

但在这种情况下,错误是

bind message supplies 0 parameters, but prepared statement "" requires

如何让Npgsql和Dapper执行PostgreSQL函数的正确方法?

c# dapper npgsql
2个回答
1
投票

CommandType.StoredProcedure 已更改为在 Npgsql 7.0 中调用存储过程,请参阅发行说明


0
投票

我也在用dapper。 2天后,我找到了这个解决方案: AppContext.SetSwitch("Npgsql.EnableStoredProcedureCompatMode", true);

© www.soinside.com 2019 - 2024. All rights reserved.