我正在尝试使用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();
order
表名。请使用orders
,因为它被保留用于order by
函数。 - Tomasz