Npgsql.PostgresException: '42P01:关系“table”不存在'

3
我正在尝试使用c#和Npgsql从给定的名称和产品列表自动生成INSERT语句以填充表。一切都很好,所以我决定添加几个触发器,这是该项目所需的。触发器相对简单,但在SQL控制台上测试时表现完美。然后,当我最终认为我已经完成了任务时,我再次使用我的C#自动填充方法进行了测试。我得到了这个错误:

Npgsql.PostgresException: '42P01:关系“buyer”不存在'

我决定再次在控制台上进行测试,使用完全相同的INSERT语句,结果它可以像应该从一开始就做的那样正常工作。在花费了3-4小时的时间进行搜索并几乎没有找到答案之后,我禁用了所有触发器,然后C#脚本就可以正常工作了。

因此,总结一下,当在控制台中输入查询时,触发器可以完美地工作,但在C#中使用时无法找到表?

CREATE OR REPLACE FUNCTION "TBP_ERA".trigger_dohvati_prvi_datum()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
  insert into "TBP_ERA".order(orderer,productname,productquantity) 
select buyer.id,buyer.productname,buyer.productquantity from buyer where buyer.ordercompleted=0 order by orderedat asc fetch first 1 rows only;
return null;
END;
$function$
;

触发器本身:

create
    trigger dohvati_datum after insert
        on
        "TBP_ERA".buyer for each row execute procedure trigger_dohvati_prvi_datum();

编辑: INSERT代码的C#部分

connection.Open();
            NpgsqlCommand command = new NpgsqlCommand("INSERT INTO \"TBP_ERA\".buyer(ID,name,productname,productquantity,ordercompleted)" +
                " VALUES(default,'" + buyer.Name + "','" + buyer.ProductName + "'," + buyer.ProductQuantity+",0);", connection);
            try
            {
                command.ExecuteNonQuery();
            }
            catch (NpgsqlException ex)
            {
                string nekej = ex.ToString();
                throw;
            }


            connection.Close();

如果它们在控制台中工作,那么你在那里没有错误,但是在你没有展示的 C# 代码中有错误。 - Steve
谢谢,我已经编辑了我的帖子。 - JodaVz
不应该使用 order 表名。请使用 orders,因为它被保留用于 order by 函数。 - Tomasz
2个回答

1

尝试在触发器函数中对buyer进行模式限定。

CREATE OR REPLACE FUNCTION "TBP_ERA".trigger_dohvati_prvi_datum()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
  insert into "TBP_ERA".order(orderer,productname,productquantity) 
select buyer.id,buyer.productname,buyer.productquantity from "TBP_ERA".buyer where buyer.ordercompleted=0 order by orderedat asc fetch first 1 rows only;
return null;
END;
$function$
;

0
在我的情况下,当我运行数据库函数并且在这个函数内部我在表名上犯了错误时,就会出现这个错误。我粘贴了函数名而不是物化视图名。检查你的函数体,逐行运行,你会找到错误

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接