using ProjectBase.Data.Pager;
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 interface IBaseDAL where T : BaseEntity
{
///
/// 定义一个操作记录的事件处理
///
event OperationLogEventHandler OnOperationLog;
#region 通用操作
///
/// 获取表的所有记录数量
///
/// 事务对象
///
int GetRecordCount(DbTransaction trans = null);
///
/// 获取表的指定条件记录数量
///
/// 条件语句
/// 事务对象
///
int GetRecordCount(string condition, DbTransaction trans = null);
///
/// 根据condition条件,判断是否存在记录
///
/// 查询的条件
/// 事务对象
/// 如果存在返回True,否则False
bool IsExistRecord(string condition, DbTransaction trans = null);
///
/// 查询数据库,检查是否存在指定键值的对象
///
/// Hashtable:键[key]为字段名;值[value]为字段对应的值
/// 事务对象
/// 存在则返回true,否则为false。
bool IsExistKey(Hashtable recordTable, DbTransaction trans = null);
///
/// 查询数据库,检查是否存在指定键值的对象
///
/// 指定的属性名
/// 指定的值
/// 事务对象
/// 存在则返回true,否则为false。
bool IsExistKey(string fieldName, object key, DbTransaction trans = null);
///
/// 获取数据库中该对象的最大ID值
///
/// 事务对象
/// 最大ID值
int GetMaxID(DbTransaction trans = null);
///
/// 根据主键和字段名称,获取对应字段的内容
///
/// 指定对象的ID
/// 字段名称
/// 事务对象
///
string GetFieldValue(object key, string fieldName, DbTransaction trans = null);
///
/// 根据指定对象的ID,从数据库中删除指定对象
///
/// 指定对象的ID
/// 事务对象
/// 执行成功返回true,否则为false。
bool Delete(object key, string userId, DbTransaction trans = null);
///
/// 根据指定条件,从数据库中删除指定对象
///
/// 删除记录的条件语句
/// 事务对象
/// Sql参数列表
/// 执行成功返回true,否则为false。
bool DeleteByCondition(string condition, DbTransaction trans = null, IDbDataParameter[] paramList = null);
///
/// 插入指定对象到数据库中
///
/// 指定的对象
/// 事务对象
/// 执行成功返回True
bool Insert(T obj, DbTransaction trans = null);
///
/// 插入指定对象到数据库中,并返回自增长的键值
///
/// 指定的对象
/// 事务对象
/// 执行成功返回True
int Insert2(T obj, DbTransaction trans = null);
///
/// 更新对象属性到数据库中
///
/// 指定的对象
/// 主键的值
/// 事务对象
/// 执行成功返回true,否则为false。
bool Update(T obj, object primaryKeyValue, DbTransaction trans = null);
///
/// 更新某个表一条记录(只适用于用单键,用string类型作键值的表)
///
/// ID值
/// Hashtable:键[key]为字段名;值[value]为字段对应的值
/// 需要操作的目标表名称
/// 事务对象,如果使用事务,传入事务对象,否则为Null不使用事务
bool Update(object id, Hashtable recordField, string targetTable, DbTransaction trans);
///
/// 插入或更新对象属性到数据库中
///
/// 指定的对象
/// 主键值
/// 事务对象
/// 执行成功返回true,否则为false。
bool InsertUpdate(T obj, object primaryKeyValue, DbTransaction trans = null);
///
/// 如果不存在记录,则插入对象属性到数据库中
///
/// 指定的对象
/// 主键值
/// 事务对象
/// 执行插入成功返回true,否则为false。
bool InsertIfNew(T obj, object primaryKeyValue, DbTransaction trans = null);
///
/// 执行SQL查询语句,返回查询结果的所有记录的第一个字段,用逗号分隔。
///
/// SQL语句
/// 事务对象
///
/// 返回查询结果的所有记录的第一个字段,用逗号分隔。
///
string SqlValueList(string sql, DbTransaction trans = null);
///
/// 执行一些特殊的语句
///
/// SQL语句
/// 事务对象
int SqlExecute(string sql, DbTransaction trans = null);
///
/// 执行存储过程函数。
///
/// 存储过程函数
/// 参数集合
/// 事务对象
///
int StoreProcExecute(string storeProcName, DbParameter[] parameters, DbTransaction trans = null);
///
/// 执行SQL查询语句,返回所有记录的DataTable集合。
///
/// SQL查询语句
/// 事务对象
///
DataTable SqlTable(string sql, DbTransaction trans = null);
///
/// 执行SQL查询语句,返回所有记录的DataTable集合。
///
/// SQL查询语句
/// SQL查询参数
/// 事务对象
///
DataTable SqlTable(string sql, DbParameter[] parameters, DbTransaction trans = null);
///
/// 打开数据库连接,并创建事务对象
///
DbTransaction CreateTransaction();
///
/// 打开数据库连接,并创建事务对象
///
/// 事务级别
DbTransaction CreateTransaction(IsolationLevel level);
///
/// 测试数据库是否正常连接
///
bool TestConnection(string connectionString);
///
/// 执行sql语句
///
/// 执行类型
/// sql语句或存储过程
/// 事务对象
///
bool Update(CommandType commandType, string sql, DbTransaction trans = null);
#endregion
#region 返回实体类操作
///
/// 查询数据库,检查是否存在指定ID的对象
///
/// 对象的ID值
/// 事务对象
/// 存在则返回指定的对象,否则返回Null
T FindByID(object key, DbTransaction trans = null);
///
/// 根据条件查询数据库,如果存在返回第一个对象
///
/// 查询的条件
/// 事务对象
/// 指定的对象
T FindSingle(string condition, DbTransaction trans = null);
///
/// 根据条件查询数据库,如果存在返回第一个对象
///
/// 查询的条件
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 事务对象
/// 指定的对象
T FindSingle(string condition, string orderBy, DbTransaction trans = null);
///
/// 根据条件查询数据库,如果存在返回第一个对象
///
/// 查询的条件
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 参数列表
/// 事务对象
/// 指定的对象
T FindSingle(string condition, string orderBy, IDbDataParameter[] paramList, DbTransaction trans = null);
///
/// 查找记录表中最新的一条记录
///
/// 事务对象
///
T FindLast(DbTransaction trans = null);
///
/// 查找记录表中最旧的一条记录
///
/// 事务对象
///
T FindFirst(DbTransaction trans = null);
#endregion
#region 返回集合的接口
///
/// 根据ID字符串(逗号分隔)获取对象列表
///
/// ID字符串(逗号分隔)
/// 事务对象
/// 符合条件的对象列表
List FindByIDs(string idString, DbTransaction trans = null);
///
/// 根据条件查询数据库,并返回对象集合
///
/// 查询的条件
/// 事务对象
/// 指定对象的集合
List Find(string condition, DbTransaction trans = null);
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 事务对象
/// 指定对象的集合
List Find(string condition, string orderBy, DbTransaction trans = null);
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 参数列表
/// 事务对象
/// 指定对象的集合
List Find(string condition, string orderBy, IDbDataParameter[] paramList, DbTransaction trans = null);
///
/// 通用获取集合对象方法
///
/// 查询的Sql语句
/// 参数列表,如果没有则为null
/// 事务对象
///
List GetList(string sql, IDbDataParameter[] paramList = null, DbTransaction trans = null);
///
/// 以分页方式通用获取集合对象方法
///
/// 查询的Sql语句
/// 分页实体
/// 参数列表,如果没有则为null
/// 事务对象
///
List GetListWithPager(string sql, PagerInfo info, IDbDataParameter[] paramList = null, DbTransaction trans = null);
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 事务对象
/// 指定对象的集合
List FindWithPager(string condition, PagerInfo info, DbTransaction trans = null);
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 事务对象
/// 指定对象的集合
List FindWithPager(string condition, PagerInfo info, string fieldToSort, DbTransaction trans = null);
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 是否降序
/// 事务对象
/// 指定对象的集合
List FindWithPager(string condition, PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null);
///
/// 返回数据库所有的对象集合
///
/// 事务对象
/// 指定对象的集合
List GetAll(DbTransaction trans = null);
///
/// 返回数据库所有的对象集合
///
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 事务对象
/// 指定对象的集合
List GetAll(string orderBy, DbTransaction trans = null);
///
/// 返回数据库所有的对象集合(用于分页数据显示)
///
/// 分页实体信息
/// 事务对象
/// 指定对象的集合
List GetAll(PagerInfo info, DbTransaction trans = null);
///
/// 返回数据库所有的对象集合(用于分页数据显示)
///
/// 分页实体信息
/// 排序字段
/// 是否降序
/// 事务对象
/// 指定对象的集合
List GetAll(PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null);
///
/// 返回所有记录到DataTable集合中
///
/// 事务对象
///
DataTable GetAllToDataTable(DbTransaction trans = null);
///
/// 返回所有记录到DataTable集合中
///
/// 自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序
/// 事务对象
///
DataTable GetAllToDataTable(string orderBy, DbTransaction trans = null);
///
/// 根据分页条件,返回DataTable对象
///
/// 分页条件
/// 事务对象
///
DataTable GetAllToDataTable(PagerInfo info, DbTransaction trans = null);
///
/// 根据分页条件,返回DataTable对象
///
/// 分页条件
/// 排序字段
/// 是否降序
/// 事务对象
///
DataTable GetAllToDataTable(PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null);
///
/// 根据查询条件,返回记录到DataTable集合中
///
/// 查询条件
/// 事务对象
///
DataTable FindToDataTable(string condition, DbTransaction trans = null);
///
/// 根据查询条件,返回记录到DataTable集合中
///
/// 查询条件
/// 分页条件
/// 事务对象
///
DataTable FindToDataTable(string condition, PagerInfo info, DbTransaction trans = null);
///
/// 根据条件查询数据库,并返回DataTable集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 是否降序
/// 事务对象
/// 指定DataTable的集合
DataTable FindToDataTable(string condition, PagerInfo info, string fieldToSort, bool desc, DbTransaction trans = null);
///
/// 获取某字段数据字典列表
///
/// 字段名称
/// 事务对象
///
List GetFieldList(string fieldName, DbTransaction trans = null);
///
/// 根据条件,获取某字段数据字典列表
///
/// 字段名称
/// 查询的条件
/// 事务对象
///
List GetFieldListByCondition(string fieldName, string condition, DbTransaction trans = null);
///
/// 根据条件,从视图里面获取记录
///
/// 视图名称
/// 查询条件
/// 事务对象
///
DataTable FindByView(string viewName, string condition, DbTransaction trans = null);
///
/// 根据条件,从视图里面获取记录
///
/// 视图名称
/// 查询条件
/// 排序字段
/// 是否为降序
/// 事务对象
///
DataTable FindByView(string viewName, string condition, string sortField, bool isDescending, DbTransaction trans = null);
///
/// 获取前面记录指定数量的记录
///
/// 查询语句
/// 指定数量
/// 排序条件,例如order by id
/// 事务对象
///
DataTable GetTopResult(string sql, int count, string orderBy, DbTransaction trans = null);
///
/// 根据条件,从视图里面获取记录
///
/// 视图名称
/// 查询条件
/// 排序字段
/// 是否为降序
/// 分页条件
/// 事务对象
///
DataTable FindByViewWithPager(string viewName, string condition, string sortField, bool isDescending, PagerInfo info, DbTransaction trans = null);
#endregion
///
/// 设置数据库配置项名称
///
/// 数据库配置项名称
void SetDbConfigName(string dbConfigName);
///
/// 初始化数据库表名
///
/// 数据库表名
void InitTableName(string tableName);
///
/// 获取数据库的全部表名称
///
///
List GetTableNames();
///
/// 获取表的字段名称和数据类型列表
///
///
DataTable GetFieldTypeList();
///
/// 获取字段中文别名(用于界面显示)的字典集合
///
///
Dictionary GetColumnNameAlias();
///
/// 获取指定字段的报表数据
///
/// 表字段
/// 查询条件
///
DataTable GetReportData(string fieldName, string condition);
}
}