zoukankan      html  css  js  c++  java
  • 事务处理多数据库的方法

    简单的例子

    List<string[]> sqls = new List<string[]>();
    string s1 = string.Empty;
    string s2 = string.Empty;
    
    ...
    
    sqls.Add(new string[] { "orderconstring", s1.ToString() });
    sqls.Add(new string[] { "jfxbconstring", s2.ToString() });
    View Code

    执行

    SqlTranHelper.ExecuteMultiTran(sqls);
    View Code

    多数据库服务器事务提交

    /// <summary>
            /// 多数据库服务器事务提交
            /// </summary>
            /// <param name="sqlStrings">key为connName,value为Sql语句</param>
            /// <returns></returns>
            public static bool ExecuteMultiTran(List<string[]> sqlStrings)
            {
                bool reval = true;
    
                SqlCommand cmd = new SqlCommand();
                SqlTransaction tran;
                SqlConnection conn;
                //事务对象名,事务对象的集合
                Dictionary<string, SqlTransaction> tranResult = new Dictionary<string, SqlTransaction>();
    
                //conn对象名,对象
                Dictionary<string, SqlConnection> connResult = new Dictionary<string, SqlConnection>();
    
                //当前是否执行成功
                bool isSuccess = true;
    
                List<string> keys = new List<string>();
    
                //通过connName进行循环执行事务
                foreach (string[] sqls in sqlStrings)
                {
                    string keyName = sqls[0];
    
                    //如果keys中已经存在当前 keyname,说明改conn的已经执行完毕,跳到下一keyname执行
                    if (!keys.Contains(keyName))
                    {
                        keys.Add(keyName);
    
                        //提交当前conn的事务,如果失败,标记当前事务失败
                        try
                        {
                            conn = CreateConnection(keyName);
                            conn.Open();
                            cmd.Connection = conn;
                            tran = conn.BeginTransaction();
                            cmd.Transaction = tran;
    
                            //记录当前事务
                            tranResult.Add(keyName, tran);
    
                            //记录当前conn
                            connResult.Add(keyName, conn);
    
                            //读取当前conn的sql,执行
                            foreach (string[] sql in sqlStrings)
                            {
                                if (sql[0] == keyName)
                                {
                                    cmd.CommandText = sql[1];
                                    cmd.ExecuteNonQuery();
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            isSuccess = false;
                        }
    
                        if (!isSuccess)
                        {
                            break;
                        }
                    }
                }
    
                //如果当前事务失败,把执行过的所有事务对象rollBack
                if (!isSuccess)
                {
                    foreach (SqlTransaction sqlTran in tranResult.Values)
                    {
                        sqlTran.Rollback();
                    }
                    reval = false;
                }
                else
                {
                    foreach (SqlTransaction sqlTran in tranResult.Values)
                    {
                        sqlTran.Commit();
                    }
                }
                //关闭conn
                foreach (SqlConnection value in connResult.Values)
                {
                    if (value.State != ConnectionState.Closed)
                    {
                        value.Close();
                    }
                }
                return reval;
            }
    
            public static SqlConnection CreateConnection(string keyName)
            {
                SqlConnection sqlconn = new SqlConnection(ConfigurationManager.AppSettings[keyName].ToString());
                return sqlconn;
            }
    View Code
  • 相关阅读:
    习题2-4 求交错序列前N项和 (15分)
    015_Web WPI
    014_捆绑包与显示模式
    013_模型验证
    012_模型绑定
    011_URL和Ajax辅助器方法
    010_模板辅助器方法
    009_辅助器方法
    008_视图
    007_控制器可扩展性
  • 原文地址:https://www.cnblogs.com/hegx/p/5996882.html
Copyright © 2011-2022 走看看