using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data.SqlClient;
using CYQ.Data.Tool;
namespace CYQ.Data
{
///
/// 数据库对象基础实例
///
internal partial class ConnBean
{
private ConnBean()
{
}
///
/// 对应的ConnectionString的Name
/// 或者最原始传进来的链接
///
public string ConnName = string.Empty;
///
/// 链接的状态是否正常。
///
public bool IsOK = true;
///
/// 是否从库
///
public bool IsSlave = false;
///
/// 是否备用库
///
public bool IsBackup = false;
///
/// 链接错误时的异常消息。
///
internal string ErrorMsg = string.Empty;
///
/// 经过格式化后的数据库链接字符串
///
public string ConnString = string.Empty;
///
/// 原始的数据库链接字符串
///
public string ConnStringOrg = string.Empty;
///
/// 数据库类型
///
public DataBaseType ConnDataBaseType;
///
/// 数据库版本信息
///
public string Version;
public ConnBean Clone()
{
ConnBean cb = new ConnBean();
cb.ConnName = this.ConnName;
cb.ConnString = this.ConnString;
cb.ConnDataBaseType = this.ConnDataBaseType;
cb.IsOK = this.IsOK;
return cb;
}
public bool TryTestConn()
{
//err = string.Empty;
if (!string.IsNullOrEmpty(ConnName) && AppConfig.GetAppBool("Conn.Result", true))
{
DalBase helper = DalCreate.CreateDal(ConnName);
try
{
helper.Con.Open();
Version = helper.Con.ServerVersion;
if (string.IsNullOrEmpty(Version))
{
Version = helper.DataBaseType.ToString();
}
helper.Con.Close();
IsOK = true;
ErrorMsg = string.Empty;
}
catch (Exception er)
{
ErrorMsg = er.Message;
IsOK = false;
}
finally
{
helper.Dispose();
}
}
else
{
IsOK = false;
}
return IsOK;
}
public string GetHashKey()
{
return StaticTool.GetHashKey(ConnString.Replace(" ", "").ToLower());
}
}
internal partial class ConnBean
{
///
/// 所有链接的对象集合
///
private static MDictionary connBeanDicCache = new MDictionary();
public static void Clear()
{
connBeanDicCache.Clear();
}
public static void Remove(string key)
{
if (!string.IsNullOrEmpty(key))
{
int hash = key.GetHashCode();
ConnBean cb = connBeanDicCache[hash];
if (cb != null)
{
connBeanDicCache.Remove(hash);
connBeanDicCache.Remove(cb.ConnName.GetHashCode());
connBeanDicCache.Remove(cb.ConnString.GetHashCode());
}
else
{
connBeanDicCache.Remove(hash);
string connString = string.Format(AppConfig.GetConn(key), AppConfig.WebRootPath);
connBeanDicCache.Remove(connString.GetHashCode());
}
}
}
public static string GetHashKey(string conn)
{
ConnBean co = Create(conn);
if (co == null)
{
return StaticTool.GetHashKey(conn);
}
return co.GetHashKey();
}
static readonly object o = new object();
///
/// 创建一个实例。
///
///
public static ConnBean Create(string connNameOrString)
{
string connString = string.Format(AppConfig.GetConn(connNameOrString), AppConfig.WebRootPath);
if (string.IsNullOrEmpty(connString))
{
return null;
}
//检测缓存中有木有
int hash = connString.GetHashCode();
if (connBeanDicCache.ContainsKey(hash))
{
ConnBean cbCache = connBeanDicCache[hash];
if (cbCache != null)
{
return cbCache;
}
}
ConnBean cb = new ConnBean();
cb.ConnName = connNameOrString;
cb.ConnDataBaseType = GetDataBaseType(connString);
cb.ConnStringOrg = connString;
cb.ConnString = RemoveConnProvider(cb.ConnDataBaseType, connString);
lock (o)
{
if (!connBeanDicCache.ContainsKey(hash))
{
connBeanDicCache.Set(hash, cb);//设置缓存
}
int hash2 = cb.ConnString.GetHashCode();
if (hash != hash2 && !connBeanDicCache.ContainsKey(hash2))
{
connBeanDicCache.Set(hash2, cb);//存两份,以connName,connString为key
}
}
return cb;
}
///
/// 去掉 链接中的 provider=xxxx;
///
public static string RemoveConnProvider(DataBaseType dal, string connString)
{
switch (dal)
{
case DataBaseType.Access:
case DataBaseType.Excel:
case DataBaseType.FoxPro:
return connString;
}
connString = RemoveKey(connString, "provider");
if (dal == DataBaseType.KingBaseES)
{
connString = RemoveKey(connString, "schema");
}
return connString;
}
private static string RemoveKey(string connString, string key)
{
string conn = connString.ToLower();
int len = key.Length;
int index = conn.IndexOf(key);
if (index > -1 && index < connString.Length - 5 && (connString[index + len] == '=' || connString[index + len + 1] == '='))
{
int end = conn.IndexOf(';', index);
if (end == -1)
{
connString = connString.Remove(index);
}
else
{
connString = connString.Remove(index, end - index + 1);
}
}
return connString;
}
public static DataBaseType GetDataBaseType(string connString)
{
connString = connString.ToLower().Replace(" ", "");//去掉空格
#region provider识别
if (connString.Contains("provider"))
{
if (connString.Contains("provider=ms"))
{
return DataBaseType.MsSql;
}
if (connString.Contains("provider=ase") || connString.Contains("provider=sb") || connString.Contains("provider=sybase"))
{
//data source=127.0.0.1;port=5000;database=cyqdata;uid=sa;pwd=123456
return DataBaseType.Sybase;
}
if (connString.Contains("provider=pg") || connString.Contains("provider=postgre") || connString.Contains("provider=postgresql") || connString.Contains("provider=npgsql"))
{
////server=.;port=5432;database=xx;uid=xx;pwd=xx;
return DataBaseType.PostgreSQL;
}
if (connString.Contains("provider=mysql"))
{
//host=localhost;port=3306;database=mysql;uid=root;pwd=123456;Convert Zero Datetime=True;
return DataBaseType.MySql;
}
if (connString.Contains("provider=db2") || connString.Contains("Provider=ibmdadb2"))
{
//Provider=IBMDADB2.IBMDBCL1;Data Source=dbname;Persist Security Info=True;User ID=username;pwd=123456;Location=ip
return DataBaseType.DB2;
}
if (connString.Contains("provider=oracle") || connString.Contains("provider=msdaora") || connString.Contains("provider=oraoledb.oracle"))
{
//Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(Sid = orcl)));User id=sa;password=123456
return DataBaseType.Oracle;
}
if (connString.Contains("provider=firebird"))
{
//User=SYSDBA;Password=masterkey;Database=;DataSource=;Port=;Dialect=3;Charset=UTF8;ServerType=0;
//user id = SYSDBA; password = 123456; database = d:\\test.fdb; server type = Default; data source = 127.0.0.1; port number = 3050
return DataBaseType.FireBird;
}
if (connString.Contains("provider=dm") || connString.Contains("provider=dameng"))
{
//user id = SYSDBA; password = 123456789; data source = 127.0.0.1; database = dmhr;
return DataBaseType.DaMeng;
}
if (connString.Contains("provider=kb") || connString.Contains("provider=kingbasees") || connString.Contains("provider=kdbndp"))
{
//server=127.0.0.1;User Id=system;Password=123456;Database=test;Port=54321
return DataBaseType.KingBaseES;
}
}
#endregion
#region 默认端口识别
if (connString.Contains("port"))
{
if (connString.Contains("=1433"))
{
return DataBaseType.MsSql;
}
if (connString.Contains("=5000"))
{
//data source=127.0.0.1;port=5000;database=cyqdata;uid=sa;pwd=123456
return DataBaseType.Sybase;
}
if (connString.Contains("=5432"))
{
////server=.;port=5432;database=xx;uid=xx;pwd=xx;
return DataBaseType.PostgreSQL;
}
if (connString.Contains("=3306"))
{
//host=localhost;port=3306;database=mysql;uid=root;pwd=123456;Convert Zero Datetime=True;
return DataBaseType.MySql;
}
if (connString.Contains("=50000"))
{
return DataBaseType.DB2;
}
if (connString.Contains("=1521"))
{
//Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(Sid = orcl)));User id=sa;password=123456
return DataBaseType.Oracle;
}
if (connString.Contains("=3050"))
{
//User=SYSDBA;Password=masterkey;Database=;DataSource=;Port=;Dialect=3;Charset=UTF8;ServerType=0;
//user id = SYSDBA; password = 123456; database = d:\\test.fdb; server type = Default; data source = 127.0.0.1; port number = 3050
return DataBaseType.FireBird;
}
if (connString.Contains("=5236"))
{
//user id = SYSDBA; password = 123456789; data source = 127.0.0.1; database = dmhr;
return DataBaseType.DaMeng;
}
if (connString.Contains("=54321"))
{
//user id = SYSDBA; password = 123456789; data source = 127.0.0.1; database = dmhr;
return DataBaseType.KingBaseES;
}
}
#endregion
#region 文件后缀识别
if (connString.Contains(".xls") || connString.Contains(".xlsx"))
{
//"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\\xxx.xls;Extended Properties='Excel 12.0;HDR=Yes;'";
return DataBaseType.Excel;
}
if (connString.Contains(".mdb") || connString.Contains(".accdb") || connString.Contains(".oledb."))
{
//Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}App_Data/demo.mdb
//Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}App_Data/demo.accdb
return DataBaseType.Access;
}
if (connString.Contains("vfpoledb.1") || connString.Contains(".dbf"))
{
//"Provider=VFPOLEDB.1;Data Source=F:\\10443.dbf";
return DataBaseType.FoxPro;
}
if (connString.Contains(".db;") || connString.Contains(".db3;") || connString.Contains("failifmissing"))
{
//Data Source={0}App_Data/demo.db;failifmissing=false
return DataBaseType.SQLite;
}
if (connString.Contains(".gdb;") || connString.Contains(".fdb;"))
{
return DataBaseType.FireBird;
}
#endregion
#region 关键字识别
if (connString.Contains("txtpath="))
{
// txt path={0}
return DataBaseType.Txt;
}
if (connString.Contains("xmlpath="))
{
// xml path={0}
return DataBaseType.Xml;
}
if (connString.Contains("description=") || connString.Contains("fororacle"))
{
//Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(Sid = orcl)));User id=sa;password=123456
return DataBaseType.Oracle;
}
if (connString.Contains("hostname=") || connString.Contains("ibmdadb2"))
{
//Provider=IBMDADB2.IBMDBCL1;Data Source=数据库名;Persist Security Info=True;User ID=用户名;pwd=密码;Location=服务器IP地址
return DataBaseType.DB2;
}
if (connString.Contains("server=") && !connString.Contains("port="))
{
//server=.;database=xx;uid=xx;pwd=xx;
return DataBaseType.MsSql;
}
#endregion
#region dll文件识别
if (connString.Contains("datasource") && (Exists("Sybase.AdoNet2.AseClient.dll") || Exists("Sybase.AdoNet4.AseClient.dll")))
{
return DataBaseType.Sybase;
}
if (connString.TrimEnd(';').Split(';').Length == 3 && (Exists("IBM.Data.DB2.dll") || Exists("IBM.Data.DB2.Core.dll")))
{
//database=xxx;uid=xxx;pwd=xxx;
return DataBaseType.DB2;
}
if (connString.Contains("host=") && Exists("MySql.Data.dll"))
{
return DataBaseType.MySql;
}
//postgre和mssql的链接语句一样,为postgre
if (Exists("Npgsql.dll"))
{
return DataBaseType.PostgreSQL;
}
if (Exists("DmProvider.dll"))
{
return DataBaseType.DaMeng;
}
if (Exists("Kdbndp.dll"))
{
return DataBaseType.KingBaseES;
}
if (Exists("FirebirdSql.Data.FirebirdClient.dll"))
{
return DataBaseType.FireBird;
}
#endregion
return DataBaseType.MsSql;
}
private static bool Exists(string dll)
{
return File.Exists(AppConfig.AssemblyPath + dll);
}
}
}