DBCHM/MJTop.Data/DBMgr.cs

212 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 数据库连接管理
/// </summary>
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)
{
}
/// <summary>
/// 连接数据库
/// </summary>
/// <param name="dbType">数据库类型连接字符串默认ConfigurationManager.ConnectionStrings[dbType.ToString()].ConnectionString</param>
/// <returns>数据库操作实例对象</returns>
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);
}
/// <summary>
/// 连接数据库
/// </summary>
/// <param name="dbType">数据库类型</param>
/// <param name="connectionString">连接字符串</param>
/// <param name="cmdTimeOut">执行超时时间(单位:秒)</param>
/// <returns>数据库操作实例对象</returns>
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);
}
/// <summary>
/// 连接数据库(拼接连接字符串)
/// </summary>
/// <param name="dbType">数据库类型</param>
/// <param name="server">host地址</param>
/// <param name="port">SqlServer默认端口1433MySql默认端口3306SqlServer默认端口1433Oracle默认端口1521PostgreSql默认端口5432,DB2默认端口50000</param>
/// <param name="databBase">数据库名称</param>
/// <param name="uid">用户名</param>
/// <param name="pwd">密码</param>
/// <param name="cmdTimeOut">执行超时时间(单位:秒)</param>
/// <returns>数据库操作实例对象</returns>
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);
}
/// <summary>
/// 获取连接字符串
/// </summary>
/// <param name="dbType">数据库类型</param>
/// <param name="server">host地址</param>
/// <param name="port">SqlServer默认端口1433MySql默认端口3306SqlServer默认端口1433Oracle默认端口1521PostgreSql默认端口5432,DB2默认端口50000</param>
/// <param name="databBase">数据库名称</param>
/// <param name="uid">用户名</param>
/// <param name="pwd">密码</param>
/// <returns>连接字符串</returns>
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;
}
/// <summary>
/// 测试连接是否成功
/// </summary>
/// <param name="dbType">数据库类型</param>
/// <param name="connectionString">连接字符串</param>
/// <param name="dbNames">数据库名称列表</param>
public static void TryConnect(DBType dbType, string connectionString, out List<string> dbNames)
{
DBFactory.TryConnect(dbType, connectionString, out dbNames);
}
}
}