using System;
|
using System.Text;
|
|
namespace CSFramework.DB
|
{
|
/// <summary>
|
/// 数据库对象工厂
|
/// </summary>
|
public static class DatabaseFactory
|
{
|
/// <summary>
|
/// 执行SQL命令超时时间,单位:秒。当未设置此参数(默认0),DbCommand默认TimeOut值,30秒。
|
/// </summary>
|
public static int CommandTimeOut { get; set; } = 30;
|
|
/// <summary>
|
/// 连接数据库服务器超时时间,单位:秒。当未设置此参数(默认0),DbConnection默认TimeOut值,15秒。
|
/// </summary>
|
public static int ConnectionTimeOut { get; set; } = 15;
|
|
/// <summary>
|
/// 创建数据库(使用DataProviderFactory创建数据存取基础组件,通用版)
|
/// </summary>
|
/// <param name="providerType">数据库类型</param>
|
/// <param name="connectionString">数据库连接字符串</param>
|
/// <returns></returns>
|
public static IDatabase CreateMDB(DatabaseType providerType,
|
string connectionString)
|
{
|
SetTimeOut(ref connectionString, ConnectionTimeOut);
|
return new DatabaseMDB(providerType, connectionString);
|
}
|
|
/// <summary>
|
/// 创建SQL Server数据库
|
/// </summary>
|
/// <param name="connectionString">数据库连接字符串</param>
|
/// <returns></returns>
|
public static IDatabase CreateSqlDatabase(string connectionString)
|
{
|
SetTimeOut(ref connectionString, ConnectionTimeOut);
|
return new DatabaseMSSQL(connectionString);
|
}
|
|
/// <summary>
|
/// 创建MySQL数据库
|
/// </summary>
|
/// <param name="connectionString">数据库连接字符串</param>
|
/// <returns></returns>
|
public static IDatabase CreateMySqlDatabase(string connectionString)
|
{
|
SetTimeOut(ref connectionString, ConnectionTimeOut);
|
return new DatabaseMySQL(connectionString);
|
}
|
|
/// <summary>
|
/// 创建Oracle数据库
|
/// </summary>
|
/// <param name="connectionString">数据库连接字符串</param>
|
/// <returns></returns>
|
public static IDatabase CreateOracleDatabase(string connectionString)
|
{
|
return new DatabaseOracle(connectionString);
|
}
|
|
/// <summary>
|
/// 创建数据库
|
/// </summary>
|
/// <param name="dbType">数据库类型</param>
|
/// <param name="connectionString">数据库连接字符串</param>
|
/// <returns></returns>
|
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("未支持的数据库类型!");
|
}
|
|
/// <summary>
|
/// 创建数据库
|
/// </summary>
|
/// <param name="dbType">数据库类型</param>
|
/// <param name="connectionString">数据库连接字符串</param>
|
/// <returns></returns>
|
public static IDatabase CreateDatabase(string dbType,
|
string connectionString)
|
{
|
SetTimeOut(ref connectionString, ConnectionTimeOut);
|
DatabaseType databaseType;
|
if (!Enum.TryParse<DatabaseType>(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("未支持的数据库类型!");
|
}
|
|
/// <summary>
|
/// ADO组件工厂
|
/// </summary>
|
/// <param name="dbType">数据库类型</param>
|
/// <param name="connectionString">数据连接字符串</param>
|
/// <returns></returns>
|
public static IAdoFactory GetADOFactory(DatabaseType dbType,
|
string connectionString)
|
{
|
SetTimeOut(ref connectionString, ConnectionTimeOut);
|
return CreateDatabase(dbType, connectionString);
|
}
|
|
/// <summary>
|
/// 更改连接字符串的超时时间(适用MsSQL,MySQL)
|
/// </summary>
|
/// <param name="sConn">连接字符串</param>
|
/// <param name="TIME_OUT">超时时间,秒</param>
|
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();
|
}
|
}
|
}
|
}
|