首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SqlCommands提交多个SqlTransaction

使用SqlCommands提交多个SqlTransaction
EN

Stack Overflow用户
提问于 2015-06-18 01:56:04
回答 2查看 3K关注 0票数 2

我试图将一个SqlCommand列表传递给一个成员函数,该成员函数保存到数据库的连接。

代码语言:javascript
复制
public void CommitAsTransaction(List<SqlCommand> commands) {
    SqlTransaction transaction = null;
    SqlConnection connection = null;

    try {
        connection = this.CreateSqlConnection();
        connection.Open();

        transaction = connection.BeginTransaction("TransactionID");

        foreach (SqlCommand cmd in commands) {
            cmd.Transaction = transaction;
            cmd.Connection = connection;
            cmd.ExecuteNonQuery();
        }

        transaction.Commit();
    }
    catch (Exception ex) {
        transaction.Rollback();
    }

    connection.Close();
}

这就是我现在所拥有的。发生此错误的原因是,该命令似乎正在按原样执行,而且从未到达transaction.Commit();。我见过很多人这样做,不知道我做错了什么。

PS:问题是要执行的存储过程都必须在单个事务中运行,我不控制它们,它们是加密的,它们必须在事务中运行是因为它们在具有PK要求的表中创建临时记录。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-23 23:42:21

非常感谢。最后,我根据其他人的综合答案自己解决了这个问题,下面是我使用的代码:

代码语言:javascript
复制
public List<Models.eConnectModels.eConnStatus> CommitAsTransaction(List<SqlCommand> commands) 
{
    SqlTransaction transaction = null;
    SqlConnection connection = null;
    List<eConnStatus> ErrorList = new List<eConnStatus>();
            
    try 
    {
        connection = this.CreateSqlConnection();
        connection.Open();
                
        transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted, "TransactionID");

        foreach (SqlCommand cmd in commands) 
        {
            eConnStatus curErr = new eConnStatus();
            cmd.Transaction = transaction;
            cmd.Connection = connection;
            
            SqlParameter errorString = cmd.Parameters.Add("@oErrString", SqlDbType.VarChar);
            errorString.Direction = ParameterDirection.Output;
            errorString.Size = 8000;

            SqlParameter errorStatus = cmd.Parameters.Add("@O_iErrorState", SqlDbType.Int);
            errorStatus.Direction = ParameterDirection.Output;

            cmd.ExecuteNonQuery();
            curErr.ErrorState = (int)cmd.Parameters["@O_iErrorState"].Value;
            curErr.ErrorMessage = (string)cmd.Parameters["@oErrString"].Value;
            ErrorList.Add(curErr);
        }

        transaction.Commit();
    }
    catch (Exception ex) 
    {
        transaction.Rollback();
        connection.Close();
        throw ex;
    }
    
    connection.Close();
    return ErrorList;
}
票数 0
EN

Stack Overflow用户

发布于 2015-06-18 04:44:34

你能用事务作用域代替吗?类似于:

代码语言:javascript
复制
// place this code inside CommitAsTransaction

using (TransactionScope scope = new TransactionScope())
{
     Boolean AllOK = true;
     SqlConnection connection = this.CreateSQLConnection();
     try
     {
         connection.Open()
     }
     catch (Exception e)
     {
       // deal with it how you need to
       AllOK = false;
     }

     if (AllOK)
     {
        foreach(SQlCommand cmd in Commands)
        {
            try
            {
                 cmd.Connection = connection;
                 cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
               // Deal with it.. 
               AllOK = false;
               break;
            }
        }

        if (AllOK)
        {
           scope.Complete();
           try
           {
               connection.Close();
           }
           catch (Exception e)
           {
             // deal with it
           }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30905273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档