我目前正在使用具有PostgreSQL后端的.Net应用程序。我正在使用NpgSQL连接两者。当我尝试执行简单的数据检索时,NpgSQL返回以下错误:
42601:“ get_all_reviews”处或附近的语法错误
PostgreSQL函数被调用:
create or replace function public.get_all_reviews()
returns TABLE(review_text text, review_sentiment integer) as $$
begin
return query select rec.review_text, rec.review_sentiment from reviews as rec;
end;
$$ language plpgsql;
ALTER FUNCTION public.get_all_reviews()
OWNER TO postgres;
C#/ NpgSQL:
public List<Review> GetReviews()
{
var reviews = new List<Review>();
var postgresqlConnection = new NpgsqlConnection("Server=localhost;Port=5432;User Id=user;Password=password;Database=db;");
postgresqlConnection.Open();
var command = new NpgsqlCommand("get_all_reviews", postgresqlConnection);
try
{
var dataReader = command.ExecuteReader();
...do stuff
postgresqlConnection.Close();
}
catch(Exception ex)
{
throw ex;
}
return reviews;
}
该异常发生在command.ExecuteReader()
上。但是,如果我在pgAdmin4中运行以下查询,则会从上述函数中获得所需的结果:
select get_all_reviews()
答案 0 :(得分:2)
您成功执行的SQL是:
select get_all_reviews()
但是,当您从C#运行它时,您运行了不同的SQL:
get_all_reviews
这样,解决方案是也要在C#中使用有效的SQL:
var command = new NpgsqlCommand("select get_all_reviews()", postgresqlConnection);
这是必需的,因为FUNCTION返回一个要从中选择的表。