using ProjectBase.Data.Pager;
using ProjectBase.Util;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBase.Data.BaseDAL
{
///
/// 业务基类对象
///
/// 业务对象类型
public class BaseBLL where T : BaseEntity, new()
{
#region 构造函数
private string dalName = "";
///
/// BLL业务类的全名(子类必须实现),可使用this.GetType().FullName
///
protected string bllFullName;
///
/// 数据访问层程序集的清单文件的文件名,不包括其扩展名,可使用Assembly.GetExecutingAssembly().GetName().Name
///
protected string dalAssemblyName;
///
/// BLL命名空间的前缀(BLL.)
///
protected string bllPrefix = "BLL.";
///
/// 基础数据访问层接口对象
///
protected IBaseDAL baseDal = null;
///
/// 默认构造函数,调用后需手动调用一次 Init() 方法进行对象初始化
///
public BaseBLL() { }
///
/// 参数赋值后,初始化相关对象
///
/// BLL业务类的全名(子类必须实现),子类构造函数传入this.GetType().FullName
/// 数据访问层程序集的清单文件的文件名,不包括其扩展名。设置为NULL或默认为Assembly.GetExecutingAssembly().GetName().Name
/// BLL命名空间的前缀(BLL.)
/// 数据库配置项名称
protected void Init(string bllFullName, string dalAssemblyName = null, string dbConfigName = null, string bllPrefix = "BLL.")
{
if (string.IsNullOrEmpty(bllFullName))
throw new ArgumentNullException("子类未设置bllFullName业务类全名!");
if (string.IsNullOrEmpty(dalAssemblyName))
{
dalAssemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
}
//赋值,准备构建对象
this.bllFullName = bllFullName;
this.dalAssemblyName = dalAssemblyName;
this.bllPrefix = bllPrefix;
#region 根据不同的数据库类型,构造相应的DAL层
//AppConfig config = new AppConfig();
string dbType = System.Configuration.ConfigurationManager.AppSettings["ComponentDbType"];
if (string.IsNullOrEmpty(dbType))
{
dbType = "sqlserver";
}
dbType = dbType.ToLower();
string DALPrefix = "";
if (dbType == "sqlserver")
{
DALPrefix = "DAL.DALSQL.";
}
else if (dbType == "access")
{
DALPrefix = "DAL.DALAccess.";
}
else if (dbType == "oracle")
{
DALPrefix = "DAL.DALOracle.";
}
else if (dbType == "sqlite")
{
DALPrefix = "DAL.DALSQL.";
}
else if (dbType == "mysql")
{
DALPrefix = "DAL.DALMySql.";
}
#endregion
this.dalName = bllFullName.Replace(bllPrefix, DALPrefix).Replace("Bl", "Dal");//替换中级的BLL.为DAL.,就是DAL类的全名
this.dalAssemblyName = dalAssemblyName.Replace("BLL", "DAL");
baseDal = Reflect>.Create(this.dalName, this.dalAssemblyName);//构造对应的DAL数据访问层的对象类
dbConfigName = dbType;
//dbConfigName = "Persist Security Info = True; Data Source = (local); Initial Catalog = simdp; user id = siasun; password = siasun; MultipleActiveResultSets = True; Integrated Security = SSPI";
if (!string.IsNullOrEmpty(dbConfigName))
{
baseDal.SetDbConfigName(dbConfigName); //设置数据库配置项名称
}
}
///
/// 调用前检查baseDal是否为空引用
///
protected void CheckDAL()
{
if (baseDal == null)
{
throw new ArgumentNullException("baseDal", "未能成功创建对应的DAL对象,请在BLL业务类构造函数中调用base.Init(**,**)方法,如base.Init(this.GetType().FullName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);");
}
}
#endregion
#region 对象添加、修改、查询接口
///
/// 插入指定对象到数据库中
///
/// 指定的对象
/// 事务对象
/// 执行操作是否成功。
public virtual bool Insert(T obj, DbTransaction trans = null)
{
CheckDAL();
return baseDal.Insert(obj, trans);
}
///
/// 插入指定对象到数据库中
///
/// 指定的对象
/// 事务对象
/// 执行成功返回新增记录的自增长ID。
public virtual int Insert2(T obj, DbTransaction trans = null)
{
CheckDAL();
return baseDal.Insert2(obj, trans);
}
///
/// 更新对象属性到数据库中
///
/// 指定的对象
/// 主键的值
/// 事务对象
/// 执行成功返回true,否则为false。
public virtual bool Update(T obj, object primaryKeyValue, DbTransaction trans = null)
{
CheckDAL();
return baseDal.Update(obj, primaryKeyValue, trans);
}
///
/// 更新数据到数据表中
///
/// SQL类型
/// sql或者存储过程
/// 事务对象
/// 执行成功返回true,否则为false。
public virtual bool Update(CommandType commandType, string sql, DbTransaction trans = null)
{
CheckDAL();
return baseDal.Update(commandType, sql, trans);
}
///
/// 更新某个表一条记录(只适用于用单键,用string类型作键值的表)
///
/// ID号
/// Hashtable:键[key]为字段名;值[value]为字段对应的值
/// 需要操作的目标表名称
/// 事务对象,如果使用事务,传入事务对象,否则为Null不使用事务
public virtual bool Update(object id, Hashtable recordField, string targetTable, DbTransaction trans)
{
CheckDAL();
return baseDal.Update(id, recordField, targetTable, trans);
}
///
/// 插入或更新对象属性到数据库中
///
/// 指定的对象
/// 主键的值
/// 事务对象
/// 执行成功返回true,否则为false。
public virtual bool InsertUpdate(T obj, object primaryKeyValue, DbTransaction trans = null)
{
CheckDAL();
return baseDal.InsertUpdate(obj, primaryKeyValue, trans);
}
///
/// 如果不存在记录,则插入对象属性到数据库中
///
/// 指定的对象
/// 主键的值
/// 事务对象
/// 执行插入成功返回true,否则为false。
public virtual bool InsertIfNew(T obj, object primaryKeyValue, DbTransaction trans = null)
{
CheckDAL();
return baseDal.InsertIfNew(obj, primaryKeyValue, trans);
}
///
/// 执行SQL查询语句,返回查询结果的所有记录的第一个字段,用逗号分隔。
///
/// SQL语句
/// 事务对象
///
/// 返回查询结果的所有记录的第一个字段,用逗号分隔。
///
public virtual string SqlValueList(string sql, DbTransaction trans = null)
{
CheckDAL();
return baseDal.SqlValueList(sql, trans);
}
///
/// 执行SQL查询语句,返回所有记录的DataTable集合。
///
/// SQL查询语句
/// 事务对象
///
public virtual DataTable SqlTable(string sql, DbTransaction trans = null)
{
CheckDAL();
return baseDal.SqlTable(sql, trans);
}
///
/// 执行SQL查询语句,返回所有记录的DataTable集合。
///
/// SQL查询语句
/// 参数集合
/// 事务对象
///
public virtual DataTable SqlTable(string sql, DbParameter[] parameters, DbTransaction trans = null)
{
CheckDAL();
return baseDal.SqlTable(sql, parameters, trans);
}
///
/// 查询数据库,检查是否存在指定ID的对象
///
/// 对象的ID值
/// 事务对象
/// 存在则返回指定的对象,否则返回Null
public virtual T FindByID(object key, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindByID(key, trans);
}
///
/// 根据条件查询数据库,如果存在返回第一个对象
///
/// 查询的条件
/// 事务对象
/// 指定的对象
public virtual T FindSingle(string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindSingle(condition, trans);
}
///
/// 根据条件查询数据库,如果存在返回第一个对象
///
/// 查询的条件
/// 排序条件
/// 事务对象
/// 指定的对象
public virtual T FindSingle(string condition, string orderBy, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindSingle(condition, orderBy, trans);
}
///
/// 查找记录表中最旧的一条记录
///
/// 事务对象
///
public virtual T FindFirst(DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindFirst(trans);
}
///
/// 查找记录表中最新的一条记录
///
/// 事务对象
///
public virtual T FindLast(DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindLast(trans);
}
#endregion
#region 返回集合的接口
///
/// 根据ID字符串(逗号分隔)获取对象列表
///
/// ID字符串(逗号分隔)
/// 事务对象
/// 符合条件的对象列表
public virtual List FindByIDs(string idString, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindByIDs(idString, trans);
}
///
/// 根据条件查询数据库,并返回对象集合
///
/// 查询的条件
/// 事务对象
/// 指定对象的集合
public virtual List Find(string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.Find(condition, trans);
}
///
/// 根据条件查询数据库,并返回对象集合
///
/// 查询的条件
/// 排序条件
/// 事务对象
/// 指定对象的集合
public virtual List Find(string condition, string orderBy, DbTransaction trans = null)
{
CheckDAL();
return baseDal.Find(condition, orderBy, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 事务对象
/// 指定对象的集合
public virtual List FindWithPager(string condition, PagerInfo info, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindWithPager(condition, info, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 事务对象
/// 指定对象的集合
public virtual List FindWithPager(string condition, PagerInfo info, string fieldToSort, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindWithPager(condition, info, fieldToSort, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 是否降序
/// 事务对象
/// 指定对象的集合
public virtual List FindWithPager(string condition, PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindWithPager(condition, info, fieldToSort, desc, trans);
}
///
/// 返回数据库所有的对象集合
///
/// 事务对象
/// 指定对象的集合
public virtual List GetAll(DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAll(trans);
}
///
/// 返回数据库所有的对象集合
///
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 事务对象
/// 指定对象的集合
public virtual List GetAll(string orderBy, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAll(orderBy, trans);
}
///
/// 返回数据库所有的对象集合(用于分页数据显示)
///
/// 分页实体信息
/// 事务对象
/// 指定对象的集合
public virtual List GetAll(PagerInfo info, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAll(info, trans);
}
///
/// 返回数据库所有的对象集合(用于分页数据显示)
///
/// 分页实体信息
/// 排序字段
/// 是否降序
/// 事务对象
/// 指定对象的集合
public virtual List GetAll(PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAll(info, fieldToSort, desc, trans);
}
///
/// 返回所有记录到DataTable集合中
///
/// 事务对象
///
public virtual DataTable GetAllToDataTable(DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAllToDataTable(trans);
}
///
/// 返回所有记录到DataTable集合中
///
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 事务对象
///
public virtual DataTable GetAllToDataTable(string orderBy, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAllToDataTable(orderBy, trans);
}
///
/// 根据分页条件,返回DataSet对象
///
/// 分页条件
/// 事务对象
///
public virtual DataTable GetAllToDataTable(PagerInfo info, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAllToDataTable(info, trans);
}
///
/// 根据分页条件,返回DataSet对象
///
/// 分页条件
/// 排序字段
/// 事务对象
/// 是否降序
///
public virtual DataTable GetAllToDataTable(PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetAllToDataTable(info, fieldToSort, desc, trans);
}
///
/// 根据查询条件,返回记录到DataTable集合中
///
/// 查询条件
/// 事务对象
///
public virtual DataTable FindToDataTable(string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindToDataTable(condition, trans);
}
///
/// 根据查询条件,返回记录到DataTable集合中
///
/// 查询条件
/// 分页条件
/// 事务对象
///
public virtual DataTable FindToDataTable(string condition, PagerInfo pagerInfo, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindToDataTable(condition, pagerInfo, trans);
}
///
/// 根据条件查询数据库,并返回DataTable集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 是否降序
/// 事务对象
/// 指定DataTable的集合
public virtual DataTable FindToDataTable(string condition, PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindToDataTable(condition, info, fieldToSort, desc, trans);
}
///
/// 获取字段列表
///
/// 字段名称
/// 事务对象
///
public virtual List GetFieldList(string fieldName, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetFieldList(fieldName, trans);
}
///
/// 根据条件,获取某字段数据字典列表
///
/// 字段名称
/// 事务对象
///
public List GetFieldListByCondition(string fieldName, string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetFieldListByCondition(fieldName, condition, trans);
}
///
/// 根据条件,从视图里面获取记录
///
/// 视图名称
/// 查询条件
/// 事务对象
///
public virtual DataTable FindByView(string viewName, string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindByView(viewName, condition, trans);
}
///
/// 根据条件,从视图里面获取记录
///
/// 视图名称
/// 查询条件
/// 排序字段
/// 是否为降序
/// 事务对象
///
public virtual DataTable FindByView(string viewName, string condition, string sortField, bool isDescending, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindByView(viewName, condition, sortField, isDescending, trans);
}
///
/// 根据条件,从视图里面获取记录
///
/// 视图名称
/// 查询条件
/// 排序字段
/// 是否为降序
/// 分页条件
/// 事务对象
///
public virtual DataTable FindByViewWithPager(string viewName, string condition, string sortField, bool isDescending, PagerInfo info, DbTransaction trans = null)
{
CheckDAL();
return baseDal.FindByViewWithPager(viewName, condition, sortField, isDescending, info, trans);
}
#endregion
#region 基础接口
///
/// 获取表的所有记录数量
///
/// 事务对象
///
public virtual int GetRecordCount(DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetRecordCount(trans);
}
///
/// 获取表的指定条件记录数量
///
/// 事务对象
///
public virtual int GetRecordCount(string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetRecordCount(condition, trans);
}
///
/// 根据condition条件,判断是否存在记录
///
/// 查询的条件
/// 事务对象
/// 如果存在返回True,否则False
public virtual bool IsExistRecord(string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.IsExistRecord(condition, trans);
}
///
/// 查询数据库,检查是否存在指定键值的对象
///
/// 指定的属性名
/// 指定的值
/// 事务对象
/// 存在则返回true,否则为false。
public virtual bool IsExistKey(string fieldName, object key, DbTransaction trans = null)
{
CheckDAL();
return baseDal.IsExistKey(fieldName, key, trans);
}
///
/// 根据主键和字段名称,获取对应字段的内容
///
/// 指定对象的ID
/// 字段名称
/// 事务对象
///
public virtual string GetFieldValue(object key, string fieldName, DbTransaction trans = null)
{
CheckDAL();
return baseDal.GetFieldValue(key, fieldName, trans);
}
///
/// 根据指定对象的ID,从数据库中删除指定对象
///
/// 指定对象的ID
/// 事务对象
/// 执行成功返回true,否则为false。
public virtual bool Delete(object key, string userId, DbTransaction trans = null)
{
CheckDAL();
return baseDal.Delete(key, userId, trans);
}
///
/// 根据指定条件,从数据库中删除指定对象
///
/// 删除记录的条件语句
/// 事务对象
/// 执行成功返回true,否则为false。
public virtual bool DeleteByCondition(string condition, DbTransaction trans = null)
{
CheckDAL();
return baseDal.DeleteByCondition(condition, trans);
}
///
/// 打开数据库连接,并创建事务对象
///
public virtual DbTransaction CreateTransaction()
{
CheckDAL();
return baseDal.CreateTransaction();
}
///
/// 打开数据库连接,并创建事务对象
///
/// 事务级别
public virtual DbTransaction CreateTransaction(IsolationLevel level)
{
CheckDAL();
return baseDal.CreateTransaction(level);
}
#endregion
#region 其他接口
///
/// 初始化数据库表名
///
/// 数据库表名
public virtual void InitTableName(string tableName)
{
CheckDAL();
baseDal.InitTableName(tableName);
}
///
/// 获取表的字段名称和数据类型列表
///
///
public virtual DataTable GetFieldTypeList()
{
CheckDAL();
return baseDal.GetFieldTypeList();
}
///
/// 获取字段中文别名(用于界面显示)的字典集合
///
///
public virtual Dictionary GetColumnNameAlias()
{
CheckDAL();
return baseDal.GetColumnNameAlias();
}
///
/// 获取指定字段的报表数据
///
/// 表字段
/// 查询条件
///
public virtual DataTable GetReportData(string fieldName, string condition)
{
CheckDAL();
return baseDal.GetReportData(fieldName, condition);
}
#endregion
}
}