【发布时间】:2009-06-03 09:45:41
【问题描述】:
我有两个要在事务中执行的存储过程。由于各种原因,我需要在我的应用程序代码中而不是在数据库中处理事务。
目前,我的代码如下所示:
try
{
using (SqlConnection conn = Connection())
{
conn.Open();
using (SqlTransaction sqlTrans = conn.BeginTransaction())
{
try
{
using (SqlCommand cmd1 = new SqlCommand("Stored_Proc_1", conn, sqlTrans))
{
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.ExecuteNonQuery();
}
using (SqlCommand cmd2 = new SqlCommand("Stored_Proc_2", conn, sqlTrans))
{
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.ExecuteNonQuery();
}
sqlTrans.Commit();
}
catch
{
sqlTrans.Rollback();
throw;
}
}
conn.Close();
}
}
catch (SqlException ex)
{
// exception handling and logging code here...
}
当其中一个存储过程引发错误时,我看到的异常消息如下所示:
Error message from raiserror within stored procedure.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
这是有道理的,因为在第一次捕获时,事务还没有回滚。
但我想要一个“干净”的错误(没有 tran count 消息 - 我对此不感兴趣,因为我 am 回滚事务)用于我的异常处理代码。 有没有办法可以重组我的代码来实现这一点?
编辑:
我的存储过程的基本结构如下所示:
create proc Stored_Proc_1
as
set nocount on
begin try
begin transaction
raiserror('Error raised by Stored_Proc_1', 16, 1)
commit
end try
begin catch
if (@@trancount > 0) rollback
declare @ErrMsg nvarchar(4000), @ErrSeverity int, @ErrProc sysname, @ErrLine varchar(10)
select @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY(), @ErrProc = ERROR_PROCEDURE(), @ErrLine = ERROR_LINE()
-- log the error
-- sql logging code here...
raiserror(@ErrMsg, @ErrSeverity, 1)
end catch
更新: 我已经从我的存储过程中取出了事务处理,这似乎已经解决了这个问题。显然我做错了——但我仍然想知道如何做对。从存储过程中删除事务是最好的解决方案吗?
【问题讨论】:
标签: c# .net sql transactions