我正在运行 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函数的正确方法?
CommandType.StoredProcedure 已更改为在 Npgsql 7.0 中调用存储过程,请参阅发行说明。
我也在用dapper。 2天后,我找到了这个解决方案: AppContext.SetSwitch("Npgsql.EnableStoredProcedureCompatMode", true);