Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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# 为什么我在使用TransactionScope时出错?_C#_Ado.net_Odbc_Transactionscope - Fatal编程技术网

C# 为什么我在使用TransactionScope时出错?

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

大家好

我在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行

下面是我的代码摘录。我做错了什么

 [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
    ,以便在成功和失败时都能正确执行

归根结底,并不是所有的连接类型——也不是所有的平台——都支持基于事务范围的事务,甚至在支持事务范围的情况下:它们可能不可预测,因为在与多个系统通信时会出现范围问题,需要DTC之类的东西

相反,我强烈建议:不要使用事务范围(除非你有很好的理由)。相反,您更喜欢更简单、支持更广泛的ADO.NET事务模型:

  • 在连接上使用
    BeginTransaction
    (或等效的异步)开始事务(毫不奇怪)
  • 在代码中携带该事务实例
  • 在每个命令上设置transaction属性(我一直不明白为什么这是必需的,因为它是通过连接隐含的,但是:它是)
  • 确保在事务结束时提交或中止事务,最好使用
    try
    /
    catch
    /
    finally
    ,以便在成功和失败时都能正确执行

您大概是说相同的代码在没有事务范围的情况下可以正常工作,对吗?最终:并不是所有的提供商都支持该API,我建议不要使用它。你在跟什么说话?(使用ODBC很难知道这一点,因为这是一个回退遗留API)。请注意,您可以尝试将Open()调用移到命令结构上方。您好,Marc!。。。谢谢你的及时回复。我很高兴我的问题引起了你的注意。我希望你能回应。我看到了你的许多反应。我总是觉得它们很有帮助……当我注释掉“using(var transactionScope=new transactionScope())”和“transactionScope.Complete()”行时,web方法完全按照预期工作,没有错误或警告。仅当我引入TransactionScope时,“odbcConnection.Open()”才会在odbcConnection尝试登记事务时引发以下异常:System.Data.Odbc.OdbcException(0x80131937):错误[08003][Sybase][Odbc驱动程序]连接未打开我已尝试以下操作。。。使用(var transactionScope=new transactionScope())使用(var transactionScope=new transactionScope(TransactionScopeOption.RequiresNew))//默认使用(var transactionScope=new transactionScope(TransactionScopeOption.RequiresNew)),它们都不起作用。我在“使用(var odbcCommand=new odbcCommand)”之前尝试了“odbcConnection.Open()”(commandText,odbcConnection))。这也不起作用。你大概是说,没有事务作用域,相同的代码可以正常工作,对吗?最终:不是所有的提供程序都支持该API,我建议不要使用它。你在这里说的是什么?(使用ODBC很难知道这一点,因为这是一个后备的遗留API)在命令结构上面打电话。嗨,马克!…谢谢你的及时回复。我很高兴我的问题引起了你的注意。我希望你能回复。我看到了你的许多回复。我总是觉得它们很有用…当我评论“使用(var transactionScope=new transactionScope())”和“transactionScope.Complete()”行中,web方法完全按照预期工作,没有错误或警告。只有在引入transactionScope时,“odbcConnection.Open()”才会在odbcConnection尝试登记事务时引发以下异常:System.Data.Odbc.OdbcException(0x80131937):错误[08003][Sybase][ODBC驱动程序]连接未打开我已尝试以下操作…使用(var transactionScope=new transactionScope())使用(var transactionScope=new transactionScope(TransactionScopeOption.Required))//默认使用(var transactionScope=new transactionScope(TransactionScopeOption.RequiresNew))这些操作都不起作用。我已尝试