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

时间:2018-12-30 19:08:47

标签: c# sql postgresql npgsql

我正在尝试自动生成INSERT语句,以使用c#和Npgsql从给定的名称和产品列表填充表。一切工作正常,因此我决定添加一些用于该项目目的的触发器。触发器相对简单,但是在sql控制台上测试它们时执行起来很不完善。然后,当我终于以为自己完成了作业后,我用C#中的自动填充方法再次对其进行了测试,这是错误的提示:

  

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

我决定再次使用完全相同的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();

1 个答案:

答案 0 :(得分:0)

尝试在触发函数中限定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$
;