我有以下存储过程:
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();
}
有关如何解决这个或为什么会发生的任何线索?
提前感谢任何帮助。
亚历
答案 0 :(得分:3)
好吧,你可能在代码中的某处,但是你需要确保将命令与事务相关联。您还需要确保该命令与事务所在的同一连接相关联。我不确定你的db.GetStoredProcCommand在做什么。
db.Connection = conn;
db.Transaction = trans;