执行命令
ClownFish支持5大类方式来操作数据库:
- 使用 CPQuery 来构造或者实现动态查询
- 使用 XmlCommand 执行配置化的SQL查询
- 使用 StoreProcedure 执行存储过程命令(不推荐)
- 基于实体 Entity 的CRUD/LINQ/Proxy
- 批量执行CUD操作
这5类操作可以通过 DbContext 的5个属性对象来访问:
- dbContext.CPQuery.Create(...).ExecuteXXX()/ToXXX()
- dbContext.XmlCommand.Create(...).ExecuteXXX()/ToXXX()
- dbContext.StoreProcedure.Create(...).ExecuteXXX()/ToXXX()
- dbContext.Entity.XXX()
- dbContext.Batch.XXX()
CPQuery/XmlCommand/StoreProcedure 它们继承同一个基类BaseCommand,因此拥有相同的操作方法。
注意:本文只列出了所有同步方法,以Async结尾的异步方法没有列出。
BaseCommand支持的操作方法
ExecuteXXX / 执行修改操作
/// <summary>
/// 执行命令,并返回影响函数
/// </summary>
/// <returns>影响行数</returns>
public int ExecuteNonQuery()
/// <summary>
/// 执行命令,返回第一行第一列的值
/// </summary>
/// <typeparam name="T">返回值类型</typeparam>
/// <returns>结果集的第一行,第一列</returns>
public T ExecuteScalar<T>()
ToXXX / 查询数据
/// <summary>
/// 执行命令,并返回第一列的值列表
/// </summary>
/// <typeparam name="T">返回值类型</typeparam>
/// <returns>结果集的第一列集合</returns>
public List<T> ToScalarList<T>()
/// <summary>
/// 执行命令,将结果集转换为实体列表
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <returns>实体集合</returns>
public List<T> ToList<T>() where T : class, new()
/// <summary>
/// 执行命令,将结果集的第一行转换为实体
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <returns>实体</returns>
public T ToSingle<T>() where T : class, new()
/// <summary>
/// 执行查询,以DataTable形式返回结果
/// </summary>
/// <param name="tableName">DataTable的表名</param>
/// <returns>查询结构的数据集</returns>
public DataTable ToDataTable(string tableName = null)
/// <summary>
/// 执行查询,以DataSet形式返回结果
/// </summary>
/// <returns>数据集</returns>
public DataSet ToDataSet()
/// <summary>
/// 执行查找命令,生成分页结果,将结果集转换为实体列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pagingInfo"></param>
/// <returns></returns>
public List<T> ToPageList<T>(PagingInfo pagingInfo) where T : class, new()
/// <summary>
/// 执行查找命令,生成分页结果
/// </summary>
/// <param name="pagingInfo"></param>
/// <returns></returns>
public DataTable ToPageTable(PagingInfo pagingInfo)
Entity支持的操作方法
开始LINQ查询
/// <summary>
/// 开始LINQ查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public EntityQuery<T> Query<T>() where T : Entity, new()
创建实体代理对象
/// <summary>
/// 创建实体的代理对象。
/// 实体代理对象可感知属性的所有变更情况,提供动态SQL生成能力,
/// 实体代理对象提供了简便的 Insert/Update/Delete 方法。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
/// <example>
/// var product = Entity.BeginEdit(product);
/// product.ProductId = 123;
/// product.ProductName = "xxxx";
/// product.Insert() or Update() or Delete()
/// </example>
/// <exception cref="NotSupportedException"></exception>
public T CreateProxy<T>(T entity = null) where T : Entity, new()
CURD 方法
/// <summary>
/// 将一个实体插入到数据库
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="entity">实体对象</param>
/// <param name="flags">Insert操作控制参数</param>
/// <returns></returns>
public long Insert<T>(T entity, InsertOption flags = InsertOption.NoSet) where T : Entity, new()
/// <summary>
/// 用当前实体的属性值(非NULL值)更新数据库
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="entity">实体对象</param>
/// <returns></returns>
public int Update<T>(T entity) where T : Entity, new()
/// <summary>
/// 根据实体类型和对应的主键字段值,删除对应的数据表记录
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="key">主键字段值</param>
/// <returns></returns>
public int Delete<T>(object key) where T : Entity, new()
/// <summary>
/// 根据实体类型和对应的主键字段值,查询对应的实体对象
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="key">主键字段值</param>
/// <returns></returns>
public T GetByKey<T>(object key) where T : Entity, new()
InsertOption 解释
/// <summary>
/// Insert操作控制参数
/// </summary>
[Flags]
public enum InsertOption
{
/// <summary>
/// 默认行为。
/// </summary>
NoSet = 0,
/// <summary>
/// 为全部字段生成INSERT语句,
/// 如果不指定此项,则(根据指定过的属性动态生成INSERT语句)
/// </summary>
AllFields = 1,
/// <summary>
/// 执行INSERT之后,需要获取新产生的 自增ID,
/// 目前仅支持 SQLSERVER/MySQL/PostgreSQL
/// </summary>
GetNewId = 2,
/// <summary>
/// 实现幂等操作,忽略重插入复异常,
/// 如果出现异常,Inert方法返回 -1
/// </summary>
IgnoreDuplicateError = 4
}
insert 会有以下几类需求:
- 根据指定过的属性动态生成INSERT语句,未指定的字段使用数据库默认值。
- 为全部字段生成INSERT语句,此方法性能会更好。
- 执行INSERT之后,需要获取新产生的 自增ID
- 实现幂等操作,忽略重插入复异常(由唯一索引触发)
insert 返回值规则定义:
- 对于需求1,如果不能生成INSERT语句(没有给任何属性赋值),则返回 0
- IgnoreDuplicateError=true 且出现 重复插入异常,则返回 -1
- GetNewId=false,正常情况返回 ExecuteNonQuery() 结果
- GetNewId=true,正常情况返回 新产生的自增ID