0

次のストアド プロシージャがあります。

CREATE PROCEDURE [dbo].[master_accounting_invoice_change]
(
    @accinvoiceuid uniqueidentifier,
    @invoicenumber nvarchar(50),
    @businessname nvarchar(150),
    @taxid nvarchar(20),
    @total money,
    @subtotal money,
    @taxamount money,
    @discountamount money,
    @invoicedate datetime,
    @createddate datetime,
    @newfolio int OUTPUT
)
AS
    IF NOT EXISTS (SELECT accinvoiceuid FROM dbo.accounting_invoice WHERE accinvoiceuid = @accinvoiceuid )
        BEGIN

            /* GET NEXT FOLIO FOR INVOICE */
            SELECT @newfolio = ISNULL(MAX(foliocurrent),0) + 1 
            FROM dbo.accounting_sender_folios
            WHERE accsenderuid = @accsenderuid
            AND isactive = 1;

            exec master_accounting_invoice_insert 
            @accinvoiceuid,
            @invoicenumber,
            @businessname,
            @taxid,
            @total,
            @subtotal,
            @taxamount,
            @discountamount,
            @comissionamount,
            @invoicedate,
            @createddate

            /* UPDATE NEXT FOLIO FOR INVOICE */
            UPDATE dbo.accounting_sender_folios
            SET foliocurrent = @newfolio
            WHERE accsenderuid = @accsenderuid
            AND isactive = 1;
        END
    ELSE
        BEGIN
            SET @newfolio = @folio;

            exec master_accounting_invoice_update 
            @accinvoiceuid,
            @invoicenumber,
            @businessname,
            @taxid,
            @total,
            @subtotal,
            @taxamount,
            @discountamount,
            @comissionamount,
            @invoicedate,
            @createddate
        END

ここで、私の C# アプリケーションでは、変更を保存するためにストアド プロシージャを呼び出しますが、問題は、例外が発生したときにfoliocurrentがロールバックされず、インクリメンタル変数が更新されて保存されることです。

以下を除くすべてがロールバックされます。

/* UPDATE NEXT FOLIO FOR INVOICE */
            UPDATE dbo.accounting_sender_folios
            SET foliocurrent = @newfolio
            WHERE accsenderuid = @accsenderuid
            AND isactive = 1;

これは C# アプリケーションのコードです。機能しています。ロールバック トランザクションは機能していますが、増分 Folio はロールバックされません。

DbConnection conn = db.CreateConnection();
conn.Open();
DbTransaction trans = conn.BeginTransaction();

try{
  using (DbCommand cmd1 = db.GetStoredProcCommand("master_accounting_invoice_change"))
  {
    db.AddInParameter(cmd1, "accinvoiceuid", DbType.Guid, dr["accinvoiceuid"]);
    .....
    .....
    .....

    db.ExecuteNonQuery(cmd1);

    newFolio = Convert.ToInt32(db.GetParameterValue(cmd1, "newfolio"));
  }
}catch(Exception ex){
    // roll back transation
    trans.Rollback();
}

これを解決する方法、またはなぜ起こっているのかについての手がかりはありますか?

事前にどんな助けにも感謝します。

アレハンドロ

4

1 に答える 1

3

コードのどこかにそれがあるかもしれませんが、コマンドをトランザクションに関連付けることを確認する必要があります。コマンドがトランザクションと同じ接続に関連付けられていることも確認する必要があります。あなたの db.GetStoredProcCommand が何をしているのかわかりません。

db.Connection = conn;
db.Transaction = trans;
于 2013-07-12T00:14:28.260 に答える