using System;
using System.Collections.Generic;
using System.Text;
using CYQ.Data.Tool;
using System.Threading;
using System.IO;
using CYQ.Data.Orm;
namespace CYQ.Data
{
///
/// 数据库类型操作类
///
internal static class DalCreate
{
//private const string SqlClient = "System.Data.SqlClient";
//private const string OleDb = "System.Data.OleDb";
//private const string OracleClient = "System.Data.OracleClient";
//private const string SQLiteClient = "System.Data.SQLite";
//private const string MySqlClient = "MySql.Data.MySqlClient";
//private const string SybaseClient = "Sybase.Data.AseClient";
//private const string PostgreClient = "System.Data.NpgSqlClient";
//private const string TxtClient = "CYQ.Data.TxtClient";
//private const string XmlClient = "CYQ.Data.XmlClient";
//private const string XHtmlClient = "CYQ.Data.XHtmlClient";
///
/// 全局存档,是为了用单例来实现全局事务。
///
private static MDictionary dalBaseDic = new MDictionary();
public static DalBase Get(string key)
{
if (dalBaseDic.ContainsKey(key))
{
return dalBaseDic[key];
}
return null;
}
public static bool Remove(string key)
{
return dalBaseDic.Remove(key);
}
///
/// 简单工厂(Factory Method)
///
public static DalBase CreateDal(string connNameOrString)
{
string key = StaticTool.GetTransationKey(connNameOrString);
//检测是否开启了全局事务;
bool isTrans = DBFast.HasTransation(key);
if (isTrans)
{
if (dalBaseDic.ContainsKey(key))
{
return dalBaseDic[key];
}
}
DalBase dal = CreateDalBase(connNameOrString);
if (isTrans)
{
dal.TranLevel = DBFast.GetTransationLevel(key);
dal.IsOpenTrans = true;
dalBaseDic.Add(key, dal);
}
return dal;
}
private static DalBase CreateDalBase(string connNameOrString)
{
//ABCConn
DalBase db = GetDalBaseBy(ConnObject.Create(connNameOrString));
if (!string.IsNullOrEmpty(connNameOrString) && db.ConnObj.Master.ConnName.ToLower() != connNameOrString.ToLower() && connNameOrString.EndsWith("Conn"))//需要切换配置。
{
//Conn A库
//BConn xxx 找不到时,找默认库。
DBResetResult result = db.ChangeDatabase(connNameOrString.Substring(0, connNameOrString.Length - 4));
if (result == DBResetResult.Yes) // 写入缓存
{
db.ConnObj.SaveToCache(connNameOrString);
}
}
return db;
}
private static DalBase GetDalBaseBy(ConnObject co)
{
DataBaseType dalType = co.Master.ConnDataBaseType;
//License.Check(providerName);//框架模块授权检测。
switch (dalType)
{
case DataBaseType.MsSql:
return new MsSqlDal(co);
case DataBaseType.Access:
case DataBaseType.Excel:
case DataBaseType.FoxPro:
return new OleDbDal(co);
case DataBaseType.Oracle:
return new OracleDal(co);
case DataBaseType.SQLite:
return new SQLiteDal(co);
case DataBaseType.MySql:
return new MySQLDal(co);
case DataBaseType.Sybase:
return new SybaseDal(co);
case DataBaseType.PostgreSQL:
return new PostgreDal(co);
case DataBaseType.DB2:
return new DB2Dal(co);
case DataBaseType.Txt:
case DataBaseType.Xml:
return new NoSqlDal(co);
case DataBaseType.FireBird:
return new FireBirdDal(co);
case DataBaseType.DaMeng:
return new DaMengDal(co);
case DataBaseType.KingBaseES:
return new KingBaseESDal(co);
}
return (DalBase)Error.Throw(string.Format("GetHelper:{0} No Be Support Now!", dalType.ToString()));
}
public static DataBaseType GetDalTypeByReaderName(string typeName)
{
switch (typeName.Replace("DataReader", "").ToLower())
{
case "oracle":
return DataBaseType.Oracle;
case "sql":
return DataBaseType.MsSql;
case "sqlite":
return DataBaseType.SQLite;
case "oledb":
return DataBaseType.Access;
case "mysql":
return DataBaseType.MySql;
case "odbc":
case "ase":
return DataBaseType.Sybase;
case "pgsql":
case "npgsql":
return DataBaseType.PostgreSQL;
case "db2":
return DataBaseType.DB2;
case "fb":
return DataBaseType.FireBird;
case "dm":
return DataBaseType.DaMeng;
case "Kdbndp":
return DataBaseType.KingBaseES;
default:
return DataBaseType.None;
}
}
}
}