我正在运行PostgreSQL 15,并将Dapper和NpgSQL7.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不是一个过程(NpgSQL7.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函数?
发布于 2022-11-19 21:58:24
CommandType.StoredProcedure已更改为调用NpgSQL7.0中的存储过程,请参阅发布说明。
https://stackoverflow.com/questions/74502536
复制相似问题