using System; using System.Collections.Generic; using System.Data.Common; namespace CSFramework.DB { /// /// 数据提供者(DbProviderFactory)工厂类 /// public static class DataProviderFactory { private static Dictionary _ProviderNames = new Dictionary(); private static Dictionary providerFactoies = new Dictionary(20); static DataProviderFactory() { // //2017-09-22测试结果: //1.经测试,使用DbProviderFactories.GetFactory(string providerInvariantName)方法 // 获取数据工厂必须在EXE主程序的App.config文件配置 // 否则会提示:找不到请求的.Net Framework Data Provider。可能没有安装! // //2017-09-14测试结果: //1.调用的目标发生了异常。 //2.未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342” // 或它的某一个依赖项。试图加载格式不正确的程序。 //_ProviderNames.Add(DatabaseType.Oracle, "Oracle.DataAccess.Client");//Provider 失败!!! 运行时版本:v2.0.50727 // _ProviderNames.Add(DatabaseType.SqlServer, "System.Data.SqlClient"); //Provider OK! _ProviderNames.Add(DatabaseType.MySQL, "MySql.Data.MySqlClient"); //Provider OK! //_ProviderNames.Add(DatabaseType.Oracle, "System.Data.OracleClient");//Provider OK! _ProviderNames.Add(DatabaseType.Oracle, "Oracle.ManagedDataAccess.Client"); //Provider OK! //以下数据库驱动程序的固定名称未经测试 //_ProviderNames.Add(DatabaseType.ODBC, "System.Data.ODBC"); //_ProviderNames.Add(DatabaseType.SQLite, "System.Data.SQLite"); //_ProviderNames.Add(DatabaseType.Firebird, "FirebirdSql.Data.Firebird"); //_ProviderNames.Add(DatabaseType.PostgreSql, "Npgsql"); //_ProviderNames.Add(DatabaseType.DB2, "IBM.Data.DB2.iSeries"); //_ProviderNames.Add(DatabaseType.Informix, "IBM.Data.Informix"); //_ProviderNames.Add(DatabaseType.SqlServerCe, "System.Data.SqlServerCe"); } /// /// 获取指定数据库类型对应的程序集名称 /// /// 数据库类型枚举 /// internal static string GetProviderInvariantName( DatabaseType providerType) { return _ProviderNames[providerType]; } /// /// 从缓存获取指定类型的数据库对应的DbProviderFactory,若不存在创建工厂对象 /// /// 数据库类型枚举 /// public static DbProviderFactory GetFactory(DatabaseType providerType) { //如果还没有加载,则加载该DbProviderFactory if (!providerFactoies.ContainsKey(providerType)) { var factory = CreateDbProviderFactory(providerType); providerFactoies.Add(providerType, factory); } return providerFactoies[providerType]; } /// /// 加载指定数据库类型的DbProviderFactory /// /// 数据库类型枚举 /// private static DbProviderFactory CreateDbProviderFactory( DatabaseType providerType) { var providerName = _ProviderNames[providerType]; DbProviderFactory factory = null; try { factory = DbProviderFactories.GetFactory(providerName); } catch (Exception ex) { factory = null; } return factory; } } }