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;
|
}
|
}
|
}
|