如何将过程从C#应用程序返回到保存点/回滚?
我正在为我的大学项目使用VS中的winforms为postgresql数据库制作GUI。作为我的任务之一,我需要创建一个可以回滚或保存点的存储sql过程,并且需要从我的C#应用程序启动它 所以(在我看来)它或多或少应该是这样工作的: 我有两个涉及的表:文档和产品。DB用于产品核算。因此,当需要新的调度时:如何将过程从C#应用程序返回到保存点/回滚?,c#,sql,postgresql,npgsql,C#,Sql,Postgresql,Npgsql,我正在为我的大学项目使用VS中的winforms为postgresql数据库制作GUI。作为我的任务之一,我需要创建一个可以回滚或保存点的存储sql过程,并且需要从我的C#应用程序启动它 所以(在我看来)它或多或少应该是这样工作的: 我有两个涉及的表:文档和产品。DB用于产品核算。因此,当需要新的调度时: 我从应用程序中传递公司名称,DBMS将其写入(作为临时数据) 我传递产品名称,posgresql检查公司是否生产此类产品(第一个数据完整性条件),如果是,则在过程中创建保存点并将其作为临时数据
CREATE PROCEDURE mydb_schema.insert_doc(
inserted_id integer, inserted_comp integer, inserted_type bool, inserted_date date, -- step 1 vars
inserted_prod integer, -- step 2 vars
inserted_amount integer -- step 3 vars
)
LANGUAGE 'plpgsql'
AS $$
DECLARE
BEGIN
--step 1
INSERT INTO mydb_schema.my_docs (doc_id, comp_id, in_doc, doc_date)
VALUES (inserted_id, inserted_comp, inserted_type, inserted_date);
--step 2
if (inserted_prod IN (SELECT prod_id FROM mydb_schema.products WHERE comp_id = inserted_comp)) THEN
INSERT INTO mydb_schema.my_docs (prod_id) VALUES (inserted_prod);
else
ROLLBACK;
END IF;
-- SAVEPOINT check_amount;
BEGIN
--step 3
if(inserted_amount > (SELECT amount FROM mydb_schema.products WHERE comp_id = inserted_comp
AND prod_id = inserted_prod)) THEN
RAISE EXCEPTION USING errcode = 'WRONG';
END IF;
EXCEPTION
WHEN SQLSTATE 'WRONG' THEN ROLLBACK;
END;
INSERT INTO mydb_schema.my_docs (amount) VALUES (inserted_amount);
END;
$$;
您需要将代码包装在“transaction”语句中
您似乎已经有了回滚逻辑,所以应该很容易做到。如果事务回滚到保存点,如何从c#app输入新参数(要指定的新金额)?这取决于您的c#代码?我无法从您的SQL代码中分辨出来。如果回滚,您可能需要返回一个像“-1”这样的结果,然后在-1状态下,您将在该结果上构建某种处理程序/存储库逻辑?当事务回滚到保存点时,我并不真正了解它的实际情况。我可以用新参数继续它吗?它是在等待我的操作还是停止(保存保存点之前完成的所有结果)?如果我不能-创建另一个函数(输入金额)只是为了输入“金额”,用它调整这个sql产品的代码,并从c应用程序执行输入金额(在一个循环中,直到成功完成),如果我得到回滚到保存点的报告,那么我将始终在数据库中获得正确的金额似乎是个好主意?