/// <summary> /// 动态加载数据库工厂 /// </summary> /// <param name="providerInvariantName"></param> /// <param name="dbType"></param> /// <returns></returns> public static DbProviderFactory GetFactory(ConfigModel config) { try { if (DbCache.Exists(CacheType.Web, config.ProviderName)) { return(DbCache.Get <object>(CacheType.Web, config.ProviderName) as DbProviderFactory); } else { var assembly = AppDomain.CurrentDomain.GetAssemblies().ToList().Find(a => a.FullName.Split(',')[0] == config.ProviderName); if (assembly == null) { assembly = Assembly.Load(config.ProviderName); } var type = assembly.GetType(config.FactoryClient, false); object instance = null; if (type != null) { instance = Activator.CreateInstance(type); } DbCache.Set <object>(CacheType.Web, config.ProviderName, instance); return(instance as DbProviderFactory); } } catch (Exception ex) { DbLog.LogException(config.IsOutError, config.DbType, ex, "GetFactory", ""); return(null); } }
public static bool DataType(string dbFile = "db.json") { var list = new List <ConfigModel>(); var cacheKey = "FastData.Core.Config"; if (DbCache.Exists(CacheType.Web, cacheKey)) { list = DbCache.Get <List <ConfigModel> >(CacheType.Web, cacheKey); } else { list = BaseConfig.GetListValue <ConfigModel>(AppSettingKey.Config, dbFile); DbCache.Set <List <ConfigModel> >(CacheType.Web, cacheKey, list); } var result = new List <bool>(); result.Add(list.Count(a => a.DbType.ToLower() == DataDbType.Oracle) > 0); result.Add(list.Count(a => a.DbType.ToLower() == DataDbType.DB2) > 0); result.Add(list.Count(a => a.DbType.ToLower() == DataDbType.MySql) > 0); result.Add(list.Count(a => a.DbType.ToLower() == DataDbType.PostgreSql) > 0); result.Add(list.Count(a => a.DbType.ToLower() == DataDbType.SQLite) > 0); result.Add(list.Count(a => a.DbType.ToLower() == DataDbType.SqlServer) > 0); return(result.Count(a => a == true) > 1); }
/// <summary> /// 读取xml map并缓存 /// </summary> public static List <string> ReadXml(string path, ConfigModel config, string fileName, string xml = null) { var map = DbCache.Get <Dictionary <string, object> >(DataConfig.Get().CacheType, "FastMap.Api") ?? new Dictionary <string, object>(); var key = new List <string>(); var sql = new List <string>(); var db = new Dictionary <string, object>(); var type = new Dictionary <string, object>(); var param = new Dictionary <string, object>(); var check = new Dictionary <string, object>(); var name = new Dictionary <string, object>(); var parameName = new Dictionary <string, object>(); GetXmlList(path, "sqlMap", ref key, ref sql, ref db, ref type, ref check, ref param, ref name, ref parameName, config, xml); for (var i = 0; i < key.Count; i++) { DbCache.Set(config.CacheType, key[i].ToLower(), sql[i]); } var apilist = new List <string>(); db.ToList().ForEach(a => { DbCache.Set(config.CacheType, string.Format("{0}.db", a.Key.ToLower()), a.Value.ToStr()); apilist.Add(a.Key.ToLower()); }); map.Remove(fileName); map.Add(fileName, apilist); DbCache.Set <Dictionary <string, object> >(config.CacheType, "FastMap.Api", map); type.ToList().ForEach(a => { DbCache.Set(config.CacheType, string.Format("{0}.type", a.Key.ToLower()), a.Value.ToStr()); key.Add(string.Format("{0}.type", a.Key.ToLower())); }); param.ToList().ForEach(a => { DbCache.Set <List <string> >(config.CacheType, string.Format("{0}.param", a.Key.ToLower()), a.Value as List <string>); key.Add(string.Format("{0}.param", a.Key.ToLower())); }); check.ToList().ForEach(a => { DbCache.Set(config.CacheType, a.Key, a.Value.ToStr()); key.Add(a.Key); }); name.ToList().ForEach(a => { DbCache.Set(config.CacheType, a.Key, a.Value.ToStr()); key.Add(a.Key); }); parameName.ToList().ForEach(a => { DbCache.Set(config.CacheType, a.Key, a.Value.ToStr()); key.Add(a.Key); }); return(key); }
/// <summary> /// 主键 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="config"></param> /// <param name="cmd"></param> /// <returns></returns> public static List <string> PrimaryKey(ConfigModel config, DbCommand cmd, string tableName) { var key = string.Format("{0}.Primary.Key", tableName); var list = new List <string>(); if (config.DbType == DataDbType.Oracle) { cmd.CommandText = string.Format("select a.COLUMN_NAME from all_cons_columns a,all_constraints b where a.constraint_name = b.constraint_name and b.constraint_type = 'P' and b.table_name = '{0}'", tableName.ToUpper()); } if (config.DbType == DataDbType.SqlServer) { cmd.CommandText = string.Format("select column_name from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='{0}'", tableName); } if (config.DbType == DataDbType.MySql) { cmd.CommandText = string.Format("select column_name from INFORMATION_SCHEMA.KEY_COLUMN_USAGE a where TABLE_NAME='{0}' and constraint_name='PRIMARY'", tableName.ToUpper()); } if (config.DbType == DataDbType.DB2) { cmd.CommandText = string.Format("select a.colname from sysibm.syskeycoluse a,syscat.tabconst b where a.tabname=b.tabnameand b.tabname='{0}' and b.type=p", tableName.ToUpper()); } if (string.IsNullOrEmpty(cmd.CommandText)) { return(list); } else { var dr = cmd.ExecuteReader(); while (dr.Read()) { list.Add(dr[0].ToString()); } dr.Close(); DbCache.Set <List <string> >(config.CacheType, key, list); return(list); } }
/// <summary> /// 获取配置实体 /// </summary> /// <param name="key"></param> /// <returns></returns> public static ConfigModel Get(string key = null, string projectName = null, string dbFile = "db.json") { var list = new List <ConfigModel>(); var item = new ConfigModel(); var cacheKey = "FastData.Core.Config"; if (DbCache.Exists(CacheType.Web, cacheKey)) { list = DbCache.Get <List <ConfigModel> >(CacheType.Web, cacheKey); } else if (projectName != null) { var assembly = Assembly.Load(projectName); using (var resource = assembly.GetManifestResourceStream(string.Format("{0}.{1}", projectName, dbFile))) { if (resource != null) { using (var reader = new StreamReader(resource)) { var content = reader.ReadToEnd(); list = BaseJson.JsonToList <ConfigModel>(BaseJson.ModelToJson(BaseJson.JsonToDic(content).GetValue("DataConfig"))); list.ForEach(a => { a.IsUpdateCache = false; }); DbCache.Set <List <ConfigModel> >(CacheType.Web, cacheKey, list); } } else { list = BaseConfig.GetListValue <ConfigModel>(AppSettingKey.Config, dbFile); DbCache.Set <List <ConfigModel> >(CacheType.Web, cacheKey, list); } } } else { list = BaseConfig.GetListValue <ConfigModel>(AppSettingKey.Config, dbFile); DbCache.Set <List <ConfigModel> >(CacheType.Web, cacheKey, list); } if (string.IsNullOrEmpty(key)) { item = list[0]; } else { item = list.Find(a => a.Key.ToLower() == key.ToLower()); } if (item.DesignModel == "") { item.DesignModel = Config.DbFirst; } if (item.SqlErrorType == "") { item.SqlErrorType = SqlErrorType.File; } if (item.CacheType == "") { item.CacheType = CacheType.Web; } item.IsPropertyCache = true; item.DbType = item.DbType.ToLower(); if (projectName != null) { item.IsUpdateCache = false; } return(item); }
/// <summary> /// foreach数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data"></param> /// <param name="name"></param> /// <param name="db"></param> /// <param name="config"></param> /// <returns></returns> public static List <T> MapForEach <T>(List <T> data, string name, DataContext db, ConfigModel config, int i = 1) where T : class, new() { var result = new List <T>(); var param = new List <DbParameter>(); var dicName = DbCache.Get(config.CacheType, string.Format("{0}.foreach.name.{1}", name.ToLower(), i)); var type = DbCache.Get(config.CacheType, string.Format("{0}.foreach.type.{1}", name.ToLower(), i)); var field = DbCache.Get(config.CacheType, string.Format("{0}.foreach.field.{1}", name.ToLower(), i)); var sql = DbCache.Get(config.CacheType, string.Format("{0}.foreach.sql.{1}", name.ToLower(), i)); Assembly assembly; if (type.IndexOf(',') > 0) { var key = string.Format("ForEach.{0}", type.Split(',')[1]); if (DbCache.Exists(CacheType.Web, key)) { assembly = DbCache.Get <object>(CacheType.Web, key) as Assembly; } else { assembly = AppDomain.CurrentDomain.GetAssemblies().ToList().Find(a => a.FullName.Split(',')[0] == type.Split(',')[1]); } if (assembly == null) { assembly = Assembly.Load(type.Split(',')[1]); } if (assembly == null) { return(data); } else { DbCache.Set <object>(CacheType.Web, key, assembly); if (assembly.GetType(type.Split(',')[0]) == null) { return(data); } foreach (var item in data) { var model = Activator.CreateInstance(assembly.GetType(type.Split(',')[0])); var list = Activator.CreateInstance(typeof(List <>).MakeGenericType(assembly.GetType(type.Split(',')[0]))); var infoResult = BaseDic.PropertyInfo <T>().Find(a => a.PropertyType.FullName == list.GetType().FullName); var dynSet = new DynamicSet(model); //param param.Clear(); if (field.IndexOf(',') > 0) { foreach (var split in field.Split(',')) { var infoField = BaseDic.PropertyInfo <T>().Find(a => a.Name.ToLower() == split); var tempParam = DbProviderFactories.GetFactory(config).CreateParameter(); tempParam.ParameterName = split; tempParam.Value = infoField.GetValue(item, null); param.Add(tempParam); } } else { var infoField = BaseDic.PropertyInfo <T>().Find(a => a.Name.ToLower() == field); var tempParam = DbProviderFactories.GetFactory(config).CreateParameter(); tempParam.ParameterName = field; tempParam.Value = infoField.GetValue(item, null); param.Add(tempParam); } var tempData = db.ExecuteSql(sql, param.ToArray(), false); foreach (var temp in tempData.DicList) { foreach (var info in model.GetType().GetProperties()) { if (temp.GetValue(info.Name).ToStr() == "" && info.PropertyType.Name == "Nullable`1") { continue; } if (info.PropertyType.Name == "Nullable`1" && info.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>)) { dynSet.SetValue(model, info.Name, Convert.ChangeType(temp.GetValue(info.Name), Nullable.GetUnderlyingType(info.PropertyType)), config.IsPropertyCache); } else { dynSet.SetValue(model, info.Name, Convert.ChangeType(temp.GetValue(info.Name), info.PropertyType), config.IsPropertyCache); } } var method = list.GetType().GetMethod("Add", BindingFlags.Instance | BindingFlags.Public); method.Invoke(list, new object[] { model }); } infoResult.SetValue(item, list); result.Add(item); } return(result); } } else { return(data); } }