Exemplo n.º 1
0
        /// <summary>从提供者和连接字符串猜测数据库处理器</summary>
        /// <param name="connStr"></param>
        /// <param name="provider"></param>
        /// <returns></returns>
        public static Type GetProviderType(String connStr, String provider)
        {
            var ioc = XCodeService.Container;

            var iDatabases = ioc.ResolveAll(typeof(IDatabase));

            // 尝试从连接字符串获取优先提供者
            if (!connStr.IsNullOrWhiteSpace())
            {
                var builder = new ConnectionStringBuilder(connStr);
                if (builder.TryGetValue("provider", out var prv))
                {
                    foreach (var item in iDatabases)
                    {
                        if (item.Instance is IDatabase db && db.Support(prv))
                        {
                            return(item.Type);
                        }
                    }
                }
            }

            if (!provider.IsNullOrEmpty())
            {
                var n = 0;
                foreach (var item in iDatabases)
                {
                    n++;
                    if ("" + item.Identity == "")
                    {
                        continue;
                    }

                    if (item.Instance is IDatabase db && db.Support(provider))
                    {
                        return(item.Type);
                    }
                }

                if (DAL.Debug)
                {
                    DAL.WriteLog("无法从{0}个默认数据库提供者中识别到{1}!", n, provider);
                }

                var type = provider.GetTypeEx(true);
                if (type != null)
                {
                    ioc.Register <IDatabase>(type, provider);
                }
                return(type);
            }
            else
            {
                // 这里的默认值来自于上面Reg里面的最后那个
                return(ioc.ResolveType <IDatabase>(String.Empty));
            }
        }
Exemplo n.º 2
0
        /// <summary>从提供者和连接字符串猜测数据库处理器</summary>
        /// <param name="connStr"></param>
        /// <param name="provider"></param>
        /// <returns></returns>
        public static Type GetProviderType(String connStr, String provider)
        {
            // 尝试从连接字符串获取优先提供者
            if (!connStr.IsNullOrWhiteSpace())
            {
                var builder = new ConnectionStringBuilder(connStr);
                if (builder.TryGetValue("provider", out var prv))
                {
                    foreach (var item in _dbs)
                    {
                        if (item.Value.Support(prv))
                        {
                            return(item.Value.GetType());
                        }
                    }
                }
            }

            // 尝试解析提供者
            if (!provider.IsNullOrEmpty())
            {
                var n = 0;
                foreach (var item in _dbs)
                {
                    n++;

                    if (item.Value.Support(provider))
                    {
                        return(item.Value.GetType());
                    }
                }

                if (DAL.Debug)
                {
                    DAL.WriteLog("无法从{0}个默认数据库提供者中识别到{1}!", n, provider);
                }

                // 注册外部提供者
                var type = provider.GetTypeEx(true);
                if (type != null)
                {
                    var db = type.CreateInstance() as IDatabase;
                    if (db != null)
                    {
                        _dbs[db.Type] = db;
                    }
                }

                return(type);
            }

            // 默认SQLite
            return(_dbs[DatabaseType.SQLite].GetType());
        }
Exemplo n.º 3
0
        protected override void OnSetConnectionString(ConnectionStringBuilder builder)
        {
            base.OnSetConnectionString(builder);

            var key = builder[Server_Key];

            if (key.EqualIgnoreCase(".", "localhost"))
            {
                //builder[Server_Key] = "127.0.0.1";
                builder[Server_Key] = IPAddress.Loopback.ToString();
            }

            if (builder.TryGetValue("Database", out var db) && db != db.ToLower())
            {
                builder["Database"] = db.ToLower();
            }
        }