using MJTop.Data.SPI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Data;
using System.Data.Common;
using System.Reflection;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
using Oracle.ManagedDataAccess.Client;
using System.Configuration;
using System.Text.RegularExpressions;
using System.Data.SQLite;
using DDTek.Oracle;
using Npgsql;
using System.Diagnostics;
namespace MJTop.Data
{
///
/// 数据库连接管理
///
public static partial class DBMgr
{
static DBMgr()
{
InitDLL();
}
static void InitDLL()
{
AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad;
// 框架加载dll失败后执行,手动加载dll
AppDomain.CurrentDomain.AssemblyResolve += (sender, senderArgs) =>
{
// 当前程序集
var executingAssembly = Assembly.GetExecutingAssembly();
// 当前程序集名称
var assemblyName = new AssemblyName(executingAssembly.FullName).Name;
// dll名称
var dllName = new AssemblyName(senderArgs.Name).Name;
// 待加载dll路径,指向当前程序集资源文件中dll路径。* 根据程序结构调整,使其正确指向dll
var dllUri = assemblyName + ".lib." + dllName + ".dll";
// 加载dll
var resourceStream = executingAssembly.GetManifestResourceStream(dllUri);
if (resourceStream == null)
{
if (!dllName.EndsWith(".resources"))
{
throw new ArgumentException(dllName + ".dll" + "未能引用!");
}
else
{
Trace.WriteLine(dllName + ",未能找到,未能引用!");
}
}
if (resourceStream != null)
{
using (resourceStream)
{
var assemblyData = new Byte[resourceStream.Length];
resourceStream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData); //加载dll
}
}
return null;
};
}
private static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
}
///
/// 连接数据库
///
/// 数据库类型(连接字符串默认:ConfigurationManager.ConnectionStrings[dbType.ToString()].ConnectionString)
/// 数据库操作实例对象
public static DB UseDB(DBType dbType, int cmdTimeOut = 30)
{
string connectionString = string.Empty;
if (ConfigurationManager.ConnectionStrings[dbType.ToString()] != null)
{
connectionString = ConfigurationManager.ConnectionStrings[dbType.ToString()].ConnectionString;
}
else
{
throw new ArgumentNullException("connectionString", dbType.ToString() + "的connectionString不能为空!");
}
//处理 如果Sqlite 连接字符串只提供 路径的情况
if (dbType == DBType.SQLite
&& Regex.IsMatch(connectionString, @"^(\w):\\(.*)(.+\.db)$",
RegexOptions.IgnoreCase | RegexOptions.Compiled))
{
connectionString = string.Format("Data Source={0};Pooling=True;BinaryGUID=True;Enlist=N;Synchronous=Off;Journal Mode=WAL;Cache Size=5000;", connectionString);
}
return DBFactory.CreateInstance(dbType, connectionString, cmdTimeOut);
}
///
/// 连接数据库
///
/// 数据库类型
/// 连接字符串
/// 执行超时时间(单位:秒)
/// 数据库操作实例对象
public static DB UseDB(DBType dbType, string connectionString, int cmdTimeOut = 30)
{
//处理 如果Sqlite 连接字符串只提供 路径的情况
if (dbType == DBType.SQLite
&& Regex.IsMatch(connectionString, @"^(.*)(.+\.db)$",
RegexOptions.IgnoreCase | RegexOptions.Compiled))
{
connectionString = string.Format("Data Source={0};Pooling=True;BinaryGUID=True;Enlist=N;Synchronous=Off;Journal Mode=WAL;Cache Size=5000;", connectionString);
}
return DBFactory.CreateInstance(dbType, connectionString, cmdTimeOut);
}
///
/// 连接数据库(拼接连接字符串)
///
/// 数据库类型
/// host地址
/// SqlServer默认端口:1433,MySql默认端口:3306,SqlServer默认端口:1433,Oracle默认端口:1521,PostgreSql默认端口:5432,DB2默认端口:50000
/// 数据库名称
/// 用户名
/// 密码
/// 执行超时时间(单位:秒)
/// 数据库操作实例对象
public static DB UseDB(DBType dbType, string server, int? port, string databBase, string uid, string pwd, int connTimeOut = 60, int cmdTimeOut = 30, string extraParam = "")
{
return DBFactory.CreateInstance(dbType, GetConnectionString(dbType, server, port, databBase, uid, pwd, connTimeOut, extraParam), cmdTimeOut);
}
public static DB UseSqlite(string dbPath, string password = null, int cmdTimeOut = 30)
{
return DBFactory.CreateInstance(DBType.SQLite, GetConnectionString(DBType.SQLite, null, null, dbPath, null, password), cmdTimeOut);
}
///
/// 获取连接字符串
///
/// 数据库类型
/// host地址
/// SqlServer默认端口:1433,MySql默认端口:3306,SqlServer默认端口:1433,Oracle默认端口:1521,PostgreSql默认端口:5432,DB2默认端口:50000
/// 数据库名称
/// 用户名
/// 密码
/// 连接字符串
public static string GetConnectionString(DBType dbType, string server, int? port, string databBase, string uid, string pwd, int connTimeOut = 60, string extraParam = "")
{
server = (server ?? string.Empty).Trim();
databBase = (databBase ?? string.Empty).Trim();
uid = (uid ?? string.Empty).Trim();
string connectionString = string.Empty;
switch (dbType)
{
case DBType.SqlServer:
connectionString = string.Format(@"server={0}{1};database={2};uid={3};pwd={4};connection timeout={5}", server, (port.HasValue ? ("," + port.Value) : string.Empty), databBase, uid, pwd, connTimeOut);
break;
case DBType.MySql:
connectionString = string.Format(@"Server={0};{1}Database={2};User={3};Password={4};OldGuids=True;connection timeout={5};" + extraParam, server, (port.HasValue ? ("Port=" + port.Value + ";") : string.Empty), databBase, uid, pwd, connTimeOut);
break;
case DBType.Oracle:
connectionString = string.Format("Data Source={0}:{1}/{2};User Id={3};password={4};Pooling=true;connection timeout={5}", server, (port ?? 1521), databBase, uid, pwd, connTimeOut);
break;
case DBType.OracleDDTek:
connectionString = string.Format("Host={0};Port={1};Service Name={2};User ID={3};Password={4};PERSIST SECURITY INFO=True;connection timeout={5}", server, (port ?? 1521), databBase, uid, pwd, connTimeOut);
break;
case DBType.PostgreSql:
connectionString = string.Format("host={0};{1}database={2};user id={3};password={4};timeout={5}", server, (port.HasValue ? ("port=" + port.Value + ";") : string.Empty), databBase, uid, pwd, connTimeOut);
break;
case DBType.SQLite:
//connectionString = string.Format("Data Source={0};Pooling=True;BinaryGUID=True;Enlist=N;Synchronous=Off;Journal Mode=WAL;Cache Size=5000;", databBase);
connectionString = string.Format("Data Source={0};", databBase);
if (!string.IsNullOrWhiteSpace(pwd))
{
connectionString += "version=3;password=" + pwd;
}
break;
case DBType.DB2:
connectionString = string.Format(@"server={0}:{1};Database={2};Uid={3};Pwd={4};connection timeout={5}", server, (port ?? 50000), databBase, uid, pwd, connTimeOut);
break;
default:
throw new ArgumentException("未知数据库类型!");
}
return connectionString;
}
///
/// 测试连接是否成功
///
/// 数据库类型
/// 连接字符串
/// 数据库名称列表
public static void TryConnect(DBType dbType, string connectionString, out List dbNames)
{
DBFactory.TryConnect(dbType, connectionString, out dbNames);
}
}
}