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