事务处理多数据库的方法

简单的例子

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
原文地址:https://www.cnblogs.com/hegx/p/5996882.html