【发布时间】:2021-05-31 11:47:12
【问题描述】:
我正在为我的大学项目使用 VS 中的 winforms 为 postgresql DB 制作 GUI。作为我的任务之一,我需要创建一个可以回滚或保存点的存储 sql 过程,并且我需要从我的 C# 应用程序启动它。
所以(如我所见)它应该或多或少像这样工作: 我有两个涉及的表:文档和产品。为产品核算而制作的数据库。所以当需要一个新的调度时:
- 我从我的应用程序中传递公司名称,然后 DBMS 将其写入(作为临时数据)
- 我传递产品名称,posgresql 检查公司是否生产此类产品(第一个数据完整性条件),如果是 - 在过程中创建保存点并将其写入临时数据,如果不是 - 回滚事务。
- 我传递了产品数量,posgresql 检查库存中是否有足够的此类产品(它满足第二个数据完整性条件),如果是 - 将其写入数据库并提交事务,或者如果不是 - 转到先前创建的保存点.我做了一个架构:link
问题是 - 我需要以某种方式获得步骤 2 和 3 的 c# gui 的结果,以便我可以决定要做什么,此外,如果步骤 3 检查失败,我不明白如何将参数重新发送到我的过程.
这里我有大概的程序代码,但由于上述问题,我什至没有机会检查它。
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;
$$;
【问题讨论】:
标签: c# sql postgresql npgsql