/// <summary>
 /// 获取数据库连接字符串
 /// </summary>
 /// <param name="dbLinkArgs">连接对象</param>
 /// <returns></returns>
 public static string GetDbLinkArgsConnStr(DbLinkArgs dbLinkArgs)
 {
     if (dbLinkArgs == null)
     {
         return(string.Empty);
     }
     return(string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3};Pooling=true;MAX Pool Size=512;Min Pool Size=50;Connection Lifetime=30", dbLinkArgs.DataSource.ObjToStr(), dbLinkArgs.DbName.ObjToStr(), dbLinkArgs.UserId.ObjToStr(), dbLinkArgs.Pwd.ObjToStr()));
 }
        /// <summary>
        /// 获取模块表名,支持跨库
        /// </summary>
        /// <param name="modelType">实体类型对象</param>
        /// <param name="currTempDblinkArgs">当前连接对象,默认为本地连接</param>
        /// <returns></returns>
        public static string GetModuleTableName(Type modelType, DbLinkArgs currTempDblinkArgs = null)
        {
            string dbType = string.Empty;
            //额外配置的连接字符串
            string connString = GetModelConnString(modelType, out dbType);

            if (string.IsNullOrWhiteSpace(dbType))
            {
                dbType = "0";
            }
            DatabaseType dbTypeEnum = DatabaseType.MsSqlServer;

            try
            {
                dbTypeEnum = (DatabaseType)Enum.Parse(typeof(DatabaseType), dbType);
            }
            catch { }
            //额外数据库连接对象
            DbLinkArgs dblinkArgs = GetDbLinkArgs(connString, dbTypeEnum);

            if (dblinkArgs != null)
            {
                //本地连接字符串
                string currConnString = WebConfigHelper.GetConnectionString("DbReadConnString");
                string currDbTypeStr  = WebConfigHelper.GetAppSettingValue("DbType");
                if (string.IsNullOrEmpty(currDbTypeStr))
                {
                    currDbTypeStr = "0";
                }
                DatabaseType currDbType = DatabaseType.MsSqlServer;
                try
                {
                    currDbType = (DatabaseType)Enum.Parse(typeof(DatabaseType), currDbTypeStr);
                }
                catch { }
                //本地连接对象
                DbLinkArgs currDblinkArgs = currTempDblinkArgs != null ? currTempDblinkArgs : GetDbLinkArgs(currConnString, currDbType);
                if (dblinkArgs.DataSource == currDblinkArgs.DataSource || dblinkArgs.DataSource == "." || dblinkArgs.DataSource == "(local)") //服务器相同或本地服务器
                {
                    if (dblinkArgs.DbName != currDblinkArgs.DbName)                                                                           //跨库不跨服务器
                    {
                        return(string.Format("[{0}].[dbo].[{1}]", dblinkArgs.DbName, modelType.Name));
                    }
                }
                else //跨服务器
                {
                    return(string.Format("[{0}].[{1}].[dbo].[{2}]", dblinkArgs.DataSource, dblinkArgs.DbName, modelType.Name));
                }
            }
            return(modelType.Name);
        }
        /// <summary>
        /// 获取模块表名,支持跨库
        /// </summary>
        /// <param name="modelType">实体类型对象</param>
        /// <param name="currTempDblinkArgs">当前连接对象,默认为本地连接</param>
        /// <returns></returns>
        public static string GetModuleTableName(Type modelType, DbLinkArgs currTempDblinkArgs = null)
        {
            string dbType     = string.Empty;
            string connString = GetModelConnString(modelType, out dbType);

            if (string.IsNullOrWhiteSpace(dbType))
            {
                dbType = "0";
            }
            DatabaseType dbTypeEnum = DatabaseType.MsSqlServer;

            try
            {
                dbTypeEnum = (DatabaseType)Enum.Parse(typeof(DatabaseType), dbType);
            }
            catch { }
            return(GetCrossTableName(modelType.Name, dbTypeEnum, connString, currTempDblinkArgs));
        }
        /// <summary>
        /// 模块数据库是否是跨服务器
        /// </summary>
        /// <param name="modelType">实体类型</param>
        /// <returns></returns>
        public static bool IsCrossServer(Type modelType)
        {
            string dbType = string.Empty;
            //额外配置的连接字符串
            string connString = GetModelConnString(modelType, out dbType);

            if (string.IsNullOrWhiteSpace(dbType))
            {
                dbType = "0";
            }
            DatabaseType dbTypeEnum = DatabaseType.MsSqlServer;

            try
            {
                dbTypeEnum = (DatabaseType)Enum.Parse(typeof(DatabaseType), dbType);
            }
            catch { }
            //额外数据库连接对象
            DbLinkArgs dblinkArgs = GetDbLinkArgs(connString, dbTypeEnum);

            if (dblinkArgs != null)
            {
                //本地连接字符串
                string currConnString = WebConfigHelper.GetConnectionString("DbReadConnString");
                string currDbTypeStr  = WebConfigHelper.GetAppSettingValue("DbType");
                if (string.IsNullOrEmpty(currDbTypeStr))
                {
                    currDbTypeStr = "0";
                }
                DatabaseType currDbType = DatabaseType.MsSqlServer;
                try
                {
                    currDbType = (DatabaseType)Enum.Parse(typeof(DatabaseType), currDbTypeStr);
                }
                catch { }
                //本地连接对象
                DbLinkArgs currDblinkArgs = GetDbLinkArgs(currConnString, currDbType);
                if (dblinkArgs.DataSource != currDblinkArgs.DataSource) //服务器不相同
                {
                    return(true);
                }
            }
            return(false);
        }
        /// <summary>
        /// 获取本地数据库连接对象
        /// </summary>
        /// <returns></returns>
        public static DbLinkArgs GetLocalDbLinkArgs()
        {
            string currConnString = WebConfigHelper.GetConnectionString("DbReadConnString");
            string currDbTypeStr  = WebConfigHelper.GetAppSettingValue("DbType");

            if (string.IsNullOrEmpty(currDbTypeStr))
            {
                currDbTypeStr = "0";
            }
            DatabaseType currDbType = DatabaseType.MsSqlServer;

            try
            {
                currDbType = (DatabaseType)Enum.Parse(typeof(DatabaseType), currDbTypeStr);
            }
            catch { }
            //本地连接对象
            DbLinkArgs currDblinkArgs = GetDbLinkArgs(currConnString, currDbType);

            return(currDblinkArgs);
        }
        /// <summary>
        /// 获取跨服务器的连接参数集合
        /// </summary>
        /// <param name="isCrossServer">是否跨库服务器,不包含服务器相同数据库不同的</param>
        /// <returns></returns>
        public static List <DbLinkArgs> GetCrossServerDbLinkArgs(bool isCrossServer = true)
        {
            List <DbLinkArgs> list            = new List <DbLinkArgs>();
            string            modelConfigPath = GetModelConfigXml();
            string            rootNode        = "/Root";
            XmlNodeList       nodeList        = XmlHelper.ReadAllChild(modelConfigPath, rootNode);

            if (nodeList != null && nodeList.Count > 0)
            {
                //本地连接对象
                DbLinkArgs currDblinkArgs = GetLocalDbLinkArgs();
                //取跨服务器的连接对象
                for (int i = 0; i < nodeList.Count; i++)
                {
                    XmlNode      node            = nodeList[i];
                    string       nodeStr         = string.Format("/Root/{0}", node.Name);
                    string       tempReadConnStr = XmlHelper.Read(modelConfigPath, nodeStr, "readConnString");
                    string       dbTypeStr       = XmlHelper.Read(modelConfigPath, nodeStr, "dbType");
                    DatabaseType dbTypeEnum      = DatabaseType.MsSqlServer;
                    try
                    {
                        dbTypeEnum = (DatabaseType)Enum.Parse(typeof(DatabaseType), dbTypeStr);
                    }
                    catch { }
                    if (!string.IsNullOrEmpty(tempReadConnStr))
                    {
                        DbLinkArgs linkArgs = GetDbLinkArgs(tempReadConnStr, dbTypeEnum);
                        if (isCrossServer) //只有服务器不相同时才添加
                        {
                            if (linkArgs.DataSource != currDblinkArgs.DataSource && list.Where(x => x.DataSource == linkArgs.DataSource).FirstOrDefault() == null)
                            {
                                list.Add(linkArgs);
                            }
                        }
                        else //只要是数据库不同就添加
                        {
                            if (linkArgs.DbName != currDblinkArgs.DbName && list.Where(x => x.DbName == linkArgs.DbName).FirstOrDefault() == null)
                            {
                                list.Add(linkArgs);
                            }
                        }
                    }
                    string tempWriteConnStr = XmlHelper.Read(modelConfigPath, nodeStr, "writeConnString");
                    if (!string.IsNullOrEmpty(tempWriteConnStr))
                    {
                        DbLinkArgs linkArgs = GetDbLinkArgs(tempWriteConnStr, dbTypeEnum);
                        if (isCrossServer)
                        {
                            if (linkArgs.DataSource != currDblinkArgs.DataSource && list.Where(x => x.DataSource == linkArgs.DataSource).FirstOrDefault() == null)
                            {
                                list.Add(linkArgs);
                            }
                        }
                        else
                        {
                            if (linkArgs.DbName != currDblinkArgs.DbName && list.Where(x => x.DbName == linkArgs.DbName).FirstOrDefault() == null)
                            {
                                list.Add(linkArgs);
                            }
                        }
                    }
                }
            }
            return(list);
        }
        /// <summary>
        /// 获取跨库模块的远程连接参数
        /// </summary>
        /// <param name="connString">连接字符串</param>
        /// <param name="dbType">数据库类型</param>
        /// <returns></returns>
        public static DbLinkArgs GetDbLinkArgs(string connString, DatabaseType dbType = DatabaseType.MsSqlServer)
        {
            DbLinkArgs dbLinkArgs = null;

            if (!string.IsNullOrWhiteSpace(connString))
            {
                #region MsSqlServer
                if (dbType == DatabaseType.MsSqlServer) //sql server数据库
                {
                    string[] token = connString.Trim().Split(";".ToCharArray());
                    if (token != null && token.Length > 0)
                    {
                        string dataSource = string.Empty;
                        string dbName     = string.Empty;
                        string uId        = string.Empty;
                        string pwd        = string.Empty;
                        foreach (string str in token)
                        {
                            if (str.StartsWith("Data Source"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    dataSource = GetDataSource(tempToken[1].Trim(), dbType);
                                }
                            }
                            else if (str.StartsWith("Initial Catalog"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    dbName = tempToken[1].Trim();
                                }
                            }
                            else if (str.StartsWith("User ID"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    uId = tempToken[1].Trim();
                                }
                            }
                            else if (str.StartsWith("Password"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    pwd = tempToken[1].Trim();
                                }
                            }
                        }
                        if (!string.IsNullOrEmpty(dataSource) && !string.IsNullOrEmpty(dbName) &&
                            !string.IsNullOrEmpty(uId) && !string.IsNullOrEmpty(pwd))
                        {
                            dbLinkArgs            = new DbLinkArgs();
                            dbLinkArgs.DataSource = dataSource;
                            dbLinkArgs.DbName     = dbName;
                            dbLinkArgs.UserId     = uId;
                            dbLinkArgs.Pwd        = pwd;
                            dbLinkArgs.DbType     = dbType;
                            dbLinkArgs.ConnString = connString;
                        }
                    }
                }
                #endregion
                #region MySql
                else if (dbType == DatabaseType.MySql) //mysql数据库
                {
                    string[] token = connString.Trim().Split(";".ToCharArray());
                    if (token != null && token.Length > 0)
                    {
                        string dataSource = string.Empty;
                        string dbName     = string.Empty;
                        string uId        = string.Empty;
                        string pwd        = string.Empty;
                        foreach (string str in token)
                        {
                            if (str.StartsWith("Server"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    dataSource = GetDataSource(tempToken[1].Trim(), dbType);
                                }
                            }
                            else if (str.StartsWith("Database"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    dbName = tempToken[1].Trim();
                                }
                            }
                            else if (str.StartsWith("User"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    uId = tempToken[1].Trim();
                                }
                            }
                            else if (str.StartsWith("Password"))
                            {
                                string[] tempToken = str.Split("=".ToCharArray());
                                if (tempToken != null && tempToken.Length == 2)
                                {
                                    pwd = tempToken[1].Trim();
                                }
                            }
                        }
                        if (!string.IsNullOrEmpty(dataSource) && !string.IsNullOrEmpty(dbName) &&
                            !string.IsNullOrEmpty(uId) && !string.IsNullOrEmpty(pwd))
                        {
                            dbLinkArgs            = new DbLinkArgs();
                            dbLinkArgs.DataSource = dataSource;
                            dbLinkArgs.DbName     = dbName;
                            dbLinkArgs.UserId     = uId;
                            dbLinkArgs.Pwd        = pwd;
                            dbLinkArgs.DbType     = dbType;
                            dbLinkArgs.ConnString = connString;
                        }
                    }
                }
                #endregion
            }
            return(dbLinkArgs);
        }