啊鑫
2024-07-09 0552fcc8cb73fc3021e2915129f55a42ed3f20e5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
using System.Collections.Generic;
using System.Data.Common;
 
namespace CSFramework.DB
{
    /// <summary>
    /// 数据提供者(DbProviderFactory)工厂类
    /// </summary>
    public static class DataProviderFactory
    {
        private static Dictionary<DatabaseType, string> _ProviderNames =
            new Dictionary<DatabaseType, string>();
 
        private static Dictionary<DatabaseType, DbProviderFactory>
            providerFactoies =
                new Dictionary<DatabaseType, DbProviderFactory>(20);
 
        static DataProviderFactory()
        {
            //
            //2017-09-22测试结果:
            //1.经测试,使用DbProviderFactories.GetFactory(string providerInvariantName)方法
            //  获取数据工厂必须在EXE主程序的App.config文件配置<system.data><DbProviderFactories>
            //  否则会提示:找不到请求的.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");
        }
 
        /// <summary>  
        /// 获取指定数据库类型对应的程序集名称  
        /// </summary>  
        /// <param name="providerType">数据库类型枚举</param>  
        /// <returns></returns>  
        internal static string GetProviderInvariantName(
            DatabaseType providerType)
        {
            return _ProviderNames[providerType];
        }
 
        /// <summary>  
        /// 从缓存获取指定类型的数据库对应的DbProviderFactory,若不存在创建工厂对象
        /// </summary>  
        /// <param name="providerType">数据库类型枚举</param>  
        /// <returns></returns>  
        public static DbProviderFactory GetFactory(DatabaseType providerType)
        {
            //如果还没有加载,则加载该DbProviderFactory  
            if (!providerFactoies.ContainsKey(providerType))
            {
                var factory = CreateDbProviderFactory(providerType);
                providerFactoies.Add(providerType, factory);
            }
 
            return providerFactoies[providerType];
        }
 
        /// <summary>  
        /// 加载指定数据库类型的DbProviderFactory  
        /// </summary>  
        /// <param name="providerType">数据库类型枚举</param>  
        /// <returns></returns>  
        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;
        }
    }
}