C# 为什么我在使用TransactionScope时出错?
大家好 我在TransactionScope方面有问题。我希望我的web方法是事务性的。如果发生任何异常,我希望回滚所有数据库更改。否则,请提交。请参阅下面的错误消息 System.ApplicationException:someClass::Method public中出错 returnType方法名称(parameterType参数): System.ApplicationException:someClass::Method private中出错 字符串方法(): System.Data.Odbc.OdbcException(0x80131937): 错误[08003][Sybase][ODBC驱动程序]连接未打开 在System.Data.Odbc.OdbcConnection.Open\u登记事务(事务 交易) 在System.Data.Odbc.OdbcConnectionOpen.EnstractTransaction(事务 交易) 在System.Data.Odbc.OdbcConnection.EnglistTransaction(事务 交易) 在System.Data.Odbc.OdbcConnection.Open()中 在c:\somePath\someClass.cs中的someNameSpace.someMethod()处:第35行 下面是我的代码摘录。我做错了什么C# 为什么我在使用TransactionScope时出错?,c#,ado.net,odbc,transactionscope,C#,Ado.net,Odbc,Transactionscope,大家好 我在TransactionScope方面有问题。我希望我的web方法是事务性的。如果发生任何异常,我希望回滚所有数据库更改。否则,请提交。请参阅下面的错误消息 System.ApplicationException:someClass::Method public中出错 returnType方法名称(parameterType参数): System.ApplicationException:someClass::Method private中出错 字符串方法(): System.Data
[WebMethod]
public returnType methodName(parameterType parameter)
{
using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
var someValue = someMethod();
:
:
:
transactionScope.Complete();
return response;
}
catch (Exception ex)
{
return ErrorMessages(ex);
}
}
}
private string someMethod()
{
var commandText = "...some valid SQL expression...";
var commandType = CommandType.Text;
try
{
using (var odbcConnection = new OdbcConnection(DefaultDbConnection.ToString()))
{
using (var odbcCommand = new OdbcCommand(commandText, odbcConnection))
{
odbcConnection.Open(); // Exception is thrown here!
odbcCommand.CommandType = commandType;
using (var reader = odbcCommand.ExecuteReader())
{
reader.Read();
return reader.GetString(0);
}
}
}
}
catch (Exception ex)
{
throw new ApplicationException("Error in someMethod.", ex);
}
}
提前感谢您的帮助 归根结底,并非所有的连接类型——也并非所有的平台——都支持基于事务范围的事务,甚至在支持事务范围的情况下:它们可能不可预测,因为在与多个系统通信时存在范围问题,需要DTC之类的东西 相反,我强烈建议:不要使用事务范围(除非你有很好的理由)。相反,您更喜欢更简单、支持更广泛的ADO.NET事务模型:
- 在连接上使用
(或等效的异步)开始事务(毫不奇怪)BeginTransaction
- 在代码中携带该事务实例
- 在每个命令上设置transaction属性(我一直不明白为什么这是必需的,因为它是通过连接隐含的,但是:它是)
- 确保在事务结束时提交或中止事务,最好使用
/try
/catch
,以便在成功和失败时都能正确执行finally
- 在连接上使用
(或等效的异步)开始事务(毫不奇怪)BeginTransaction
- 在代码中携带该事务实例
- 在每个命令上设置transaction属性(我一直不明白为什么这是必需的,因为它是通过连接隐含的,但是:它是)
- 确保在事务结束时提交或中止事务,最好使用
/try
/catch
,以便在成功和失败时都能正确执行finally