/// <summary> /// 加载允许环境中的驱动SqlServer /// </summary> /// <param name="path"></param> /// <returns></returns> private static bool LoadSqlServer(string path) { string dllPath = path; if (!path.ToLower().Trim().EndsWith(DllExtension)) { dllPath = path + DllExtension; } if (!dllPath.EndsWith("System.Data" + DllExtension)) { return(false); } string dir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); string[] file = Directory.GetFiles(dir, "System.Data" + DllExtension); if (file.Length != 0) { Assembly assembly = Assembly.LoadFrom(file[0]); Type con = assembly.GetType("System.Data.SqlClient.SqlConnection"); Type cmd = assembly.GetType("System.Data.SqlClient.SqlCommand"); Type param = assembly.GetType("System.Data.SqlClient.SqlParameter"); Type adapter = assembly.GetType("System.Data.SqlClient.SqlDataAdapter"); AssemblyDLLType dLLType = new AssemblyDLLType() { CommandType = cmd, ConnectType = con, DataAdapterType = adapter, ParameterType = param }; dicAssemblyDLLType[path] = dLLType; return(true); } return(false); }
/// <summary> /// 创建无参构造函数对象 /// </summary> /// <param name="path"></param> /// <returns></returns> public static IDbCommand GetDbCommand(string path) { AssemblyDLLType assemblyDLLType = null; if (dicAssemblyDLLType.TryGetValue(path, out assemblyDLLType)) { IDbCommand command = (IDbCommand)Activator.CreateInstance(assemblyDLLType.CommandType); return(command); } return(null); }
/// <summary> /// 创建无参构造函数对象 /// </summary> /// <param name="path"></param> /// <returns></returns> public static IDbDataAdapter GetDataAdapter(string path) { AssemblyDLLType assemblyDLLType = null; if (dicAssemblyDLLType.TryGetValue(path, out assemblyDLLType)) { IDbDataAdapter adapter = (IDbDataAdapter)Activator.CreateInstance(assemblyDLLType.DataAdapterType); return(adapter); } return(null); }
/// <summary> /// 获取驱动对象 /// </summary> /// <param name="path"></param> /// <returns></returns> public static IDbConnection GetConnection(string path) { Type type = null; AssemblyDLLType assemblyDLLType = null; if (dicAssemblyDLLType.TryGetValue(path, out assemblyDLLType)) { IDbConnection connection = (IDbConnection)Activator.CreateInstance(assemblyDLLType.ConnectType); return(connection); } else { if (path == null) { return(null); } string dllPath = path; if (!path.ToLower().Trim().EndsWith(DllName)) { dllPath = path + DllName; } bool token = false; try { Monitor.Enter(lock_obj, ref token); FileInfo fileInfo = new FileInfo(dllPath); if (!fileInfo.Exists) { Logger.Singleton.Error("没有找到驱动程序集!路径:" + path); } Assembly assembly = Assembly.LoadFrom(dllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll Type[] allTypes = assembly.GetTypes(); AssemblyDLLType dLLType = new AssemblyDLLType(); int num = 4; foreach (Type tmp in allTypes) { if (!tmp.IsClass || tmp.IsAbstract) { continue; } if (typeof(IDbConnection).IsAssignableFrom(tmp)) { type = tmp; dLLType.ConnectType = tmp; num--; } if (typeof(IDbCommand).IsAssignableFrom(tmp)) { dLLType.CommandType = tmp; num--; } if (typeof(IDbDataAdapter).IsAssignableFrom(tmp)) { dLLType.DataAdapterType = tmp; num--; } if (typeof(IDbDataParameter).IsAssignableFrom(tmp)) { dLLType.ParameterType = tmp; num--; } if (num == 0) { break; } } if (type == null) { Logger.Singleton.ErrorFormat("{0}-程序集,类型没有找到", path); } dicAssemblyDLLType[path] = dLLType; IDbConnection connection = (IDbConnection)Activator.CreateInstance(type); return(connection); } catch (Exception ex) { Logger.Singleton.Error(string.Format("{0}-程序集加载失败", path), ex); } finally { if (token) { Monitor.Exit(lock_obj); } } return(null); } }