Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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 Server 2005_Transactions - Fatal编程技术网

执行C#代码时出现事务问题

执行C#代码时出现事务问题,c#,sql-server-2005,transactions,C#,Sql Server 2005,Transactions,在M代码中,我得到一个错误,“此SqlTransaction已完成;不再可用。”生成此代码的代码行如下 sqlTransaction MSSqlConnectionHandler.CommitTransaction(); 此CommitTransaction函数是 public static void CommitTransaction() { try { _theTran.Commit(); }

在M代码中,我得到一个错误,“此SqlTransaction已完成;不再可用。”生成此代码的代码行如下 sqlTransaction

MSSqlConnectionHandler.CommitTransaction();
此CommitTransaction函数是

public static void CommitTransaction()
    {
        try
        {
            _theTran.Commit();
        }
        catch (Exception Ex)
        {
            try
            {
                _theTran.Rollback();
            }
            catch (Exception InnerEx)
            {
                throw InnerEx;
            }
            throw Ex;
        }
    }
但是,我要注释掉这个MSSqlConnectionHandler.CommitTransaction();行,则不会发生错误,但也不会保存任何数据。
出了什么问题,我应该在这里提供什么来让它更清楚?Thanx Previous

该错误表示事务正在代码中的其他地方提交,是否为可在其他地方使用和提交的实例变量?

可能是事务所在的连接已关闭。如果是这样的话,在调用时:

_theTran.Commit(); 
错误将会发生

谁在打电话

CommitTransaction
在提交之前应该做一些检查,比如:

if (conn.State == ConnectionState.Open) 
{
     if (_theTran != null)
     {
          CommitTransaction();
     }
     conn.Close();
}
就异常处理而言,异常处理程序除了重新刷新之外什么也不做。如果提交时发生异常,请尝试回滚并始终抛出。我认为你不需要内心的尝试

try
{             
    _theTran.Commit();         
}         
catch (Exception)
{                        
    _theTran.Rollback();             
    throw;
} 

为什么要捕获异常,然后(错误地)重新抛出异常?这是毫无意义的,而且你失去了你的呼叫堆栈什么是
\u theTran
?它有一种静态方法的代码味道。@Mitch Wheat:CommitTransaction()不是我写的,它是由团队的前程序员写的,我不是在指责他。我只是告诉大家,我必须遵循代码的前一个结构,我必须使用hat方法,不管怎样,我经常在需要澄清或无法处理错误的地方发布代码段,而这个网站和像你这样的人是我唯一的希望。你能告诉我捕获然后(错误地)重新抛出异常是什么意思吗?我需要更多的解释来实现它。建议你继续@Daniel a.White指出全局/静态\u theTran。。。。