SQL Server回滚事务无法正常工作

时间:2013-07-12 00:10:28

标签: c# sql sql-server sql-server-2008 transactions

我有以下存储过程:

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#应用程序中的代码。正在运行,回滚事务正在运行,但它不会回滚增量作品集。

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();
}

有关如何解决这个或为什么会发生的任何线索?

提前感谢任何帮助。

亚历

1 个答案:

答案 0 :(得分:3)

好吧,你可能在代码中的某处,但是你需要确保将命令与事务相关联。您还需要确保该命令与事务所在的同一连接相关联。我不确定你的db.GetStoredProcCommand在做什么。

db.Connection = conn;
db.Transaction = trans;