【问题标题】:How do I return procedure to savepoints/rollback from a C# application?如何从 C# 应用程序将过程返回到保存点/回滚?
【发布时间】:2021-05-31 11:47:12
【问题描述】:

我正在为我的大学项目使用 VS 中的 winforms 为 postgresql DB 制作 GUI。作为我的任务之一,我需要创建一个可以回滚或保存点的存储 sql 过程,并且我需要从我的 C# 应用程序启动它。

所以(如我所见)它应该或多或少像这样工作: 我有两个涉及的表:文档和产品。为产品核算而制作的数据库。所以当需要一个新的调度时:

  1. 我从我的应用程序中传递公司名称,然后 DBMS 将其写入(作为临时数据)
  2. 我传递产品名称,posgresql 检查公司是否生产此类产品(第一个数据完整性条件),如果是 - 在过程中创建保存点并将其写入临时数据,如果不是 - 回滚事务。
  3. 我传递了产品数量,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


    【解决方案1】:

    您需要将代码包装在“事务”语句中。

    你似乎已经有了回滚逻辑,所以你应该很容易做到。

    【讨论】:

    • 如果我的事务回滚到保存点,我如何从 c# 应用程序输入新参数(要指定的新数量)?
    • 嗯,这取决于你的 C# 代码?我无法从您的 SQL 代码中分辨出来。如果回滚,您可能需要返回类似“-1”的结果,然后在 -1 状态下,您会在该结果上构建某种处理程序/存储库逻辑?
    • 当我的事务回滚到保存点时,我并没有真正了解它实际发生了什么。我可以以某种方式使用新参数继续它 - 它是在等待我的操作还是停止(保存在保存点之前完成的所有结果)?如果我不能 - 创建另一个函数(enter_amount)只是为了输入“金额”,用它调整这个 sql prodecure 的代码并从 c# app enter_amount 执行(在一个循环中直到它成功完成)如果我得到回滚的报告保存点,所以我将始终在我的数据库中获得正确的数量似乎是个好主意?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多