Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将过程从C#应用程序返回到保存点/回滚?_C#_Sql_Postgresql_Npgsql - Fatal编程技术网

如何将过程从C#应用程序返回到保存点/回滚?

如何将过程从C#应用程序返回到保存点/回滚?,c#,sql,postgresql,npgsql,C#,Sql,Postgresql,Npgsql,我正在为我的大学项目使用VS中的winforms为postgresql数据库制作GUI。作为我的任务之一,我需要创建一个可以回滚或保存点的存储sql过程,并且需要从我的C#应用程序启动它 所以(在我看来)它或多或少应该是这样工作的: 我有两个涉及的表:文档和产品。DB用于产品核算。因此,当需要新的调度时: 我从应用程序中传递公司名称,DBMS将其写入(作为临时数据) 我传递产品名称,posgresql检查公司是否生产此类产品(第一个数据完整性条件),如果是,则在过程中创建保存点并将其作为临时数据

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

所以(在我看来)它或多或少应该是这样工作的: 我有两个涉及的表:文档和产品。DB用于产品核算。因此,当需要新的调度时:

  • 我从应用程序中传递公司名称,DBMS将其写入(作为临时数据)
  • 我传递产品名称,posgresql检查公司是否生产此类产品(第一个数据完整性条件),如果是,则在过程中创建保存点并将其作为临时数据写入,如果不是,则回滚事务
  • 我通过了产品数量,posgresql检查库存中是否有足够的此类产品(它满足第二个数据完整性条件),如果有,将其写入db并提交事务,或者如果没有,则转到先前创建的保存点。我做了一个模式:
  • 问题是-我需要以某种方式将结果发送到第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;
    $$;
    

    您需要将代码包装在“transaction”语句中


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

    如果事务回滚到保存点,如何从c#app输入新参数(要指定的新金额)?这取决于您的c#代码?我无法从您的SQL代码中分辨出来。如果回滚,您可能需要返回一个像“-1”这样的结果,然后在-1状态下,您将在该结果上构建某种处理程序/存储库逻辑?当事务回滚到保存点时,我并不真正了解它的实际情况。我可以用新参数继续它吗?它是在等待我的操作还是停止(保存保存点之前完成的所有结果)?如果我不能-创建另一个函数(输入金额)只是为了输入“金额”,用它调整这个sql产品的代码,并从c应用程序执行输入金额(在一个循环中,直到成功完成),如果我得到回滚到保存点的报告,那么我将始终在数据库中获得正确的金额似乎是个好主意?