c# - 在批处理结束时检测到不可提交的事务。事务回滚
问题描述
我有一个存储过程,我使用事务从 ac# 代码调用它。当我在 C#(它是一个控制台应用程序)中运行代码时,我没有从 catch 块中获取结果,而是抛出了一个异常:
在批处理结束时检测到不可提交的事务。事务被回滚。
C#代码:
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace app1
{
class Program
{
static void Main(string[] args)
{
string res = "";
string resDesc = "";
res = WriteToDB(1,out resDesc);
Console.WriteLine(res);
Console.WriteLine(resDesc);
Console.Read();
}
public static string WriteToDB(int val, out string resultDesc)
{
resultDesc = "";
string result = "";
string connectionString = ConfigurationManager.ConnectionStrings["SqlAppConnection"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlTransaction transaction = connection.BeginTransaction("transcation1");
try
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = transaction.Connection;
cmd.Transaction = transaction;
cmd.CommandText = "usp_Test_Proc";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@check", val);
SqlParameter res = cmd.Parameters.Add("@result", SqlDbType.Int);
res.Direction = ParameterDirection.Output;
SqlParameter resDesc = cmd.Parameters.Add("@resultDesc", SqlDbType.VarChar, 100);
resDesc.Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
result = res.Value.ToString().Trim();
resultDesc = resDesc.Value.ToString();
transaction.Commit();
}
}
catch (Exception ex)
{
result = "Exception";
resultDesc = ex.Message;
transaction.Rollback();
}
}
return result;
}
}
}
存储过程:
ALTER PROCEDURE [dbo].[usp_Test_Proc] (
@check int,
@result INT output,
@resultDesc VARCHAR(100)
output)
AS
BEGIN
SET nocount ON;
SET xact_abort ON;
IF @check != 0
BEGIN
BEGIN try
SET @result = 0;
SET @resultDesc = 'aa';
--RAISERROR('Error from raiserror',1,1)
THROW 99001, 'Error from throw', 1;
END try
BEGIN catch
SET @result = 1;
SET @resultDesc = concat('catch block',ERROR_MESSAGE());
END catch;
END
ELSE
BEGIN
SET @result = 0;
SET @resultDesc = 'done';
end
END;
GO
当存储过程抛出错误时,我没有进入 catch 块,而是返回一个异常,说“在批处理结束时检测到不可提交的事务。事务被回滚。”
当我从 C# 代码中调用它时,为什么结果不同?
解决方案
推荐阅读
- php - 如何在 laravel 中获得没有一个特定产品 ID 的所有产品类别?
- laravel - 如何转换 2021-05-24T04:44:56+00:00 格式的日期时间?
- javascript - 无法读取未定义反应复选框的“已检查”属性
- python - python函数中的运行时错误(列表,实践中的字符串混淆问题)
- azure - 在 ARM 模板 IPRestriction 中包含 Front Door ID
- python - 使用箭头控制步进电机
- flutter - Q 错误:Android 工具链 - 为 Android 设备开发
- dart - Bang 运算符与断言语句
- python - 卡在字符串编号部分..当我输入字符串时,代码返回错误,因为输入函数已被强制转换为整数
- azure - 为什么可以将资源移动到 Azure 中的只读资源组?