using System;
using System.Text;
namespace CSFramework.DB
{
///
/// 数据库对象工厂
///
public static class DatabaseFactory
{
///
/// 执行SQL命令超时时间,单位:秒。当未设置此参数(默认0),DbCommand默认TimeOut值,30秒。
///
public static int CommandTimeOut { get; set; } = 30;
///
/// 连接数据库服务器超时时间,单位:秒。当未设置此参数(默认0),DbConnection默认TimeOut值,15秒。
///
public static int ConnectionTimeOut { get; set; } = 15;
///
/// 创建数据库(使用DataProviderFactory创建数据存取基础组件,通用版)
///
/// 数据库类型
/// 数据库连接字符串
///
public static IDatabase CreateMDB(DatabaseType providerType,
string connectionString)
{
SetTimeOut(ref connectionString, ConnectionTimeOut);
return new DatabaseMDB(providerType, connectionString);
}
///
/// 创建SQL Server数据库
///
/// 数据库连接字符串
///
public static IDatabase CreateSqlDatabase(string connectionString)
{
SetTimeOut(ref connectionString, ConnectionTimeOut);
return new DatabaseMSSQL(connectionString);
}
///
/// 创建MySQL数据库
///
/// 数据库连接字符串
///
public static IDatabase CreateMySqlDatabase(string connectionString)
{
SetTimeOut(ref connectionString, ConnectionTimeOut);
return new DatabaseMySQL(connectionString);
}
///
/// 创建Oracle数据库
///
/// 数据库连接字符串
///
public static IDatabase CreateOracleDatabase(string connectionString)
{
return new DatabaseOracle(connectionString);
}
///
/// 创建数据库
///
/// 数据库类型
/// 数据库连接字符串
///
public static IDatabase CreateDatabase(DatabaseType dbType,
string connectionString)
{
if (dbType == DatabaseType.SqlServer)
{
SetTimeOut(ref connectionString, ConnectionTimeOut);
return new DatabaseMSSQL(connectionString);
}
if (dbType == DatabaseType.MySQL)
{
SetTimeOut(ref connectionString, ConnectionTimeOut);
return new DatabaseMySQL(connectionString);
}
if (dbType == DatabaseType.Oracle)
return new DatabaseOracle(connectionString);
throw new Exception("未支持的数据库类型!");
}
///
/// 创建数据库
///
/// 数据库类型
/// 数据库连接字符串
///
public static IDatabase CreateDatabase(string dbType,
string connectionString)
{
SetTimeOut(ref connectionString, ConnectionTimeOut);
DatabaseType databaseType;
if (!Enum.TryParse(dbType, true, out databaseType))
throw new Exception("不支持的数据库类型!");
if (databaseType == DatabaseType.SqlServer)
return new DatabaseMSSQL(connectionString);
if (databaseType == DatabaseType.MySQL)
return new DatabaseMySQL(connectionString);
if (databaseType == DatabaseType.Oracle)
return new DatabaseOracle(connectionString);
throw new Exception("未支持的数据库类型!");
}
///
/// ADO组件工厂
///
/// 数据库类型
/// 数据连接字符串
///
public static IAdoFactory GetADOFactory(DatabaseType dbType,
string connectionString)
{
SetTimeOut(ref connectionString, ConnectionTimeOut);
return CreateDatabase(dbType, connectionString);
}
///
/// 更改连接字符串的超时时间(适用MsSQL,MySQL)
///
/// 连接字符串
/// 超时时间,秒
internal static void SetTimeOut(ref string sConn, int TIME_OUT)
{
//连接字符串没有定义Connection TimeOut
if (sConn.ToLower().IndexOf("Connection TimeOut".ToLower(), 0) <= 0)
{
sConn = sConn + ";Connection TimeOut=" + TIME_OUT.ToString() +
";";
}
else
{
//分隔
var items = sConn.Split(new char[] { ';' },
StringSplitOptions.RemoveEmptyEntries);
//string item = items.Where(e => e.ToLower().IndexOf("Connection TimeOut".ToLower(), 0) >= 0).FirstOrDefault();
for (var i = 0; i <= items.Length - 1; i++)
{
var s = items[i];
//;Connection TimeOut={4};
if (s.ToLower()
.IndexOf("Connection TimeOut".ToLower(), 0) >= 0)
{
var t = s.Split('=');
items[i] = "Connection TimeOut=" + TIME_OUT.ToString();
}
}
var sb = new StringBuilder();
foreach (var s in items) sb.Append(s + ";");
sConn = sb.ToString();
}
}
}
}