请教大侠,怎么判断事务是否执行成功和失败

牵着你的手 2013-04-04 04:34:13
set xact_abort ON
BEGIN TRAN
UPDATE Recharge SET status=1 WHERE id=@id
UPDATE Users SET balance=balance+@pay WHERE ID=@userId
COMMIT TRAN
RETURN 66;--处理成功


我这样可以保证出了错能回滚,但是不是无论事务成功还是失败都会返回66.

怎么让成功的时候返回66,没有成功返回65,但没成功的情况下必须能回滚.

能否给个示例,谢谢了
...全文
646 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
牵着你的手 2013-04-04
  • 打赏
  • 举报
回复
引用 13 楼 szm341 的回复:
其实如果出错的话应该在command.ExecuteNonQuery();这句上 很久没弄过了,忘记差不多了,感觉确实很奇怪,不清楚是否跟vs环境设置有关系
多谢大侠,果然是VS设置问题,我禁用了“仅我的代码”
szm341 2013-04-04
  • 打赏
  • 举报
回复
其实如果出错的话应该在command.ExecuteNonQuery();这句上 很久没弄过了,忘记差不多了,感觉确实很奇怪,不清楚是否跟vs环境设置有关系
牵着你的手 2013-04-04
  • 打赏
  • 举报
回复
引用 11 楼 szm341 的回复:
BuildIntCommand这个方法貌似不是.net本身的方法,应该重写的吧,也许这里面封装着try catch的语句呢~
确实没有
private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
        {
            SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
            command.Parameters.Add(new SqlParameter("ReturnValue",
                SqlDbType.Int, 4, ParameterDirection.ReturnValue,
                false, 0, 0, string.Empty, DataRowVersion.Default, null));
            return command;
        }

        private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
        {
            SqlCommand command = new SqlCommand(storedProcName, connection);
            command.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter parameter in parameters)
            {
                if (parameter != null)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                        (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    command.Parameters.Add(parameter);
                }
            }
            return command;
        }
szm341 2013-04-04
  • 打赏
  • 举报
回复
BuildIntCommand这个方法貌似不是.net本身的方法,应该重写的吧,也许这里面封装着try catch的语句呢~
牵着你的手 2013-04-04
  • 打赏
  • 举报
回复
引用 9 楼 szm341 的回复:
引用 7 楼 huaxuankeji 的回复:引用 6 楼 szm341 的回复:那确实很奇怪,一般调试都会出给出错误提示,而且.net中也有try catch语句可以捕获异常的 强制回滚下,没有产生任何.net异常 .net的try catch要比sqlserver的强大,应该会捕捉到异常的 如果你没捕捉到,很可能你调用数据库的代码方法是封装好了的,里面已经进……
我本来也是这样想的,但我确实没有任何try catch
 public static int RunProcedureReturn(string storedProcName, IDataParameter[] parameters)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                int result;
                connection.Open();
                SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
                command.ExecuteNonQuery();
                result = (int)command.Parameters["ReturnValue"].Value;
                connection.Close();
                return result;
            }
        }
szm341 2013-04-04
  • 打赏
  • 举报
回复
引用 7 楼 huaxuankeji 的回复:
引用 6 楼 szm341 的回复:那确实很奇怪,一般调试都会出给出错误提示,而且.net中也有try catch语句可以捕获异常的 强制回滚下,没有产生任何.net异常
.net的try catch要比sqlserver的强大,应该会捕捉到异常的 如果你没捕捉到,很可能你调用数据库的代码方法是封装好了的,里面已经进行了try catch捕获,但是catch块中并未将异常抛出,所以就认为没有错误
牵着你的手 2013-04-04
  • 打赏
  • 举报
回复
引用 6 楼 szm341 的回复:
那确实很奇怪,一般调试都会出给出错误提示,而且.net中也有try catch语句可以捕获异常的
可能这个不属于.net的异常范畴吧
牵着你的手 2013-04-04
  • 打赏
  • 举报
回复
引用 6 楼 szm341 的回复:
那确实很奇怪,一般调试都会出给出错误提示,而且.net中也有try catch语句可以捕获异常的
强制回滚下,没有产生任何.net异常
szm341 2013-04-04
  • 打赏
  • 举报
回复
那确实很奇怪,一般调试都会出给出错误提示,而且.net中也有try catch语句可以捕获异常的
牵着你的手 2013-04-04
  • 打赏
  • 举报
回复
引用 4 楼 szm341 的回复:
引用 3 楼 huaxuankeji 的回复:引用 2 楼 szm341 的回复:2005以上版本可以用try catch语句 SQL code?1234567891011begin try BEGIN TRAN UPDATE Recharge SET status=1 WHERE id=@id UPDATE U……
我直接改了表名,应该是错误级别高了。插入主键可以获取到。 asp.net里比较奇怪,异常也不报,直接就断开调试了。 错误级别低可以获取到
szm341 2013-04-04
  • 打赏
  • 举报
回复
引用 3 楼 huaxuankeji 的回复:
引用 2 楼 szm341 的回复:2005以上版本可以用try catch语句 SQL code?1234567891011begin try BEGIN TRAN UPDATE Recharge SET status=1 WHERE id=@id UPDATE Users SET balance=balanc……
一般不会,不过如果你的错误等级比较高的话,无论是#1还是#2的方法都会中断过程的 过程中断一般会引起强制回滚,这样就获得不到返回值了
牵着你的手 2013-04-04
  • 打赏
  • 举报
回复
引用 2 楼 szm341 的回复:
2005以上版本可以用try catch语句 SQL code?1234567891011begin try BEGIN TRAN UPDATE Recharge SET status=1 WHERE id=@id UPDATE Users SET balance=balance+@pay WHERE ID=@u……
貌似出错了就得不到return值
szm341 2013-04-04
  • 打赏
  • 举报
回复
2005以上版本可以用try catch语句

begin try
        BEGIN TRAN
            UPDATE Recharge SET status=1 WHERE id=@id
            UPDATE Users SET balance=balance+@pay WHERE ID=@userId
        COMMIT TRAN
        RETURN 66;--处理成功
end try
begin catch
    rollback tran
    return 99;--失败回滚
end catch
shoppo0505 2013-04-04
  • 打赏
  • 举报
回复
set xact_abort ON BEGIN TRAN UPDATE Recharge SET status=1 WHERE id=@id if @@ERROR > 0 begin rollback return 65 end UPDATE Users SET balance=balance+@pay WHERE ID=@userId if @@ERROR > 0 begin rollback return 65 end COMMIT TRAN RETURN 66;--处理成功

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧