Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此事务已完成;它不再可用了搞不清是怎么回事_C#_Sql_Asp.net_.net - Fatal编程技术网

C# 此事务已完成;它不再可用了搞不清是怎么回事

C# 此事务已完成;它不再可用了搞不清是怎么回事,c#,sql,asp.net,.net,C#,Sql,Asp.net,.net,我有一段代码连接到数据库进行日志记录;然后调用一个函数,如果该函数为真,我将再次调用我的数据库来修改它。 如果为false,则返回需要处理的System.Web.WebException 然而,无论我如何处理它,当它返回这个异常时,我的“事务”返回它已经完成。我已经尝试删除代码的第二部分,所以这根本不是我的问题,但我会将其包括在内,以便它更有意义 在这次修订之前,我使用了两个catch语句,每个语句中都有一个rollback方法,但将其转换为一个catch,以查看这是否导致了问题,但显然不是 p

我有一段代码连接到数据库进行日志记录;然后调用一个函数,如果该函数为真,我将再次调用我的数据库来修改它。 如果为false,则返回需要处理的System.Web.WebException

然而,无论我如何处理它,当它返回这个异常时,我的“事务”返回它已经完成。我已经尝试删除代码的第二部分,所以这根本不是我的问题,但我会将其包括在内,以便它更有意义

在这次修订之前,我使用了两个catch语句,每个语句中都有一个rollback方法,但将其转换为一个catch,以查看这是否导致了问题,但显然不是

public bool CreateNewLicense登录信息logInfo、字符串产品、字符串电子邮件、字符串座位、输出字符串响应QLM、输出字符串响应Logger、输出ILicenseInfo许可证 { 布尔状态=假; 使用SqlConnection connection=new SqlConnectionSystem.Web.Configuration.WebConfigurationManager.ConnectionStrings[redact].ConnectionString { 连接。打开; int logId=-1; 使用SqlCommand cmd=newsqlcommandsql,连接 { SqlTransaction=connection.BeginTransactionSolationLevel.ReadCommitted; cmd.Transaction=Transaction; 来自方法输入的区域参数定义。 cmd.Parameters。Add@ActionID,SqlDbType.Int.Value=logInfo.ActionId; cmd.Parameters。Add@ActionDesc,SqlDbType.VarChar.Value=string.IsNullOrEmptylogInfo.ActionDesc?objectDBNull.Value:logInfo.ActionDesc; cmd.Parameters。Add@Timestamp,SqlDbType.DateTime.Value=DateTime.Now; cmd.Parameters。Add@CustomerEmail,SqlDbType.VarChar.Value=string.IsNullOrEmptylogInfo.CustomerEmail?objectDBNull.Value:logInfo.CustomerEmail; cmd.Parameters。Add@KeyValueAfter,SqlDbType.VarChar.Value=string.IsNullOrEmptylogInfo.KeyValueAfter?objectDBNull.Value:logInfo.KeyValueAfter; cmd.Parameters。Add@LicenseKey,SqlDbType.VarChar.Value=string.IsNullOrEmptylogInfo.LicenseKey?objectDBNull.Value:logInfo.LicenseKey; cmd.Parameters。Add@GUID,SqlDbType.VarChar.Value=logInfo.Guid; 端区 尝试 { logId=Convert.ToInt32cmd.ExecuteScalar; 事务。提交; responseLogger=已成功记录; 如果!\u licenseHandler.CreateNewLicenseproduct、电子邮件、座位、输出响应QLM、输出许可 创建许可证时抛出新System.Net.WebExceptionError; responseQLM=已成功创建新的许可证密钥:; } 捕获异常e { 如果e.GetType==typeofSystem.Net.WebException { responseQLM=e.消息; 响应记录器=; } 其他的 { responseLogger=e.消息; } 尝试 { 事务。回滚; } 捕获SqlException SqlException { responseLogger+=@\n+sqlException.Message; } 投 } 状态=真; 如果logId>=0 { 字符串alterSQL=@UPDATE[PLISLMTTraceback] 设置[LicenseKey]=@LicenseKey 其中[LogIndex]=@LogId; 使用SqlCommand alterCmd=new-SqlCommandalterSQL,连接 { SqlTransaction transactionTwo=connection.BeginTransactionSolationLevel.ReadCommitted; alterCmd.Transaction=transactionTwo; alterCmd.Parameters。Add@LicenseKey,SqlDbType.VarChar.Value=string.IsNullOrEmptylicense.ActivationKey?objectDBNull.Value:license.ActivationKey; alterCmd.Parameters。Add@LogId,SqlDbType.Int.Value=logId; 尝试 { alterCmd.ExecuteNonQuery; 事务2.提交; } 捕获异常sqlAlterException { responseLogger=Li 授权密钥记录失败:+sqlAlterException.Message; 尝试 { 事务二、回滚; } 捕获SqlException SqlException { responseLogger+=@\n+sqlException.Message; } 投 } } } } } 返回状态; } } 我希望它在抛出该异常后执行回滚

throw new System.Net.WebException("Error Creating License");
您正在引发异常,然后尝试回滚已提交的事务。这不行。一旦你承诺了,你就不能收回

我建议两种方法中的一种

方法一:

更改您的逻辑以预先创建许可证密钥,然后对数据库进行单次插入。这将更快,只保留很少的DB锁,并且时间很短,并且不需要使用任何显式事务,因为您只需要执行一次插入。代码可能会简单得多

方法二:


删除所有事务的使用。插入记录基本上就是你现在所做的。然后,在不保持DB连接/事务打开的情况下,创建许可证。如果许可证创建成功,则对刚才插入的记录运行DB更新。如果未成功创建许可证,则对刚插入的记录运行DB delete。

请创建一个最小、完整、可验证的示例。另外,请给我们异常的名称、类型和确切行。@mjwills我正在遵循一个MSDN示例,这就是我认为它将如何工作的。因此,提交本质上是“保存”,必须在我的许可证事件之后完成。而且我需要记录我正在创建一个许可证,该许可证返回一个许可证,然后我需要将该许可证添加到我的表中。如果日志记录失败,我不想创建许可证密钥。我不知道如何区分这一点,因为如果许可证创建失败,我也想回滚,因此它在函数中。另外,Christopher-回滚时发生异常,这非常清楚…@mjwills应该可以解决我的问题。除了在数据库中创建一些关于这是一种尝试的注释外,我认为没有办法解决它。不管怎样,提交都是问题所在,谢谢你。除了@mjwills所说的,你使用SqlConnection。。。应该仅围绕对DB的调用进行包装。这里面发生的事情太多了using@CaseyCrookston我会调查的,谢谢。