执行命令

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 会有以下几类需求:

  1. 根据指定过的属性动态生成INSERT语句,未指定的字段使用数据库默认值。
  2. 为全部字段生成INSERT语句,此方法性能会更好。
  3. 执行INSERT之后,需要获取新产生的 自增ID
  4. 实现幂等操作,忽略重插入复异常(由唯一索引触发)

insert 返回值规则定义:
  1. 对于需求1,如果不能生成INSERT语句(没有给任何属性赋值),则返回 0
  2. IgnoreDuplicateError=true 且出现 重复插入异常,则返回 -1
  3. GetNewId=false,正常情况返回 ExecuteNonQuery() 结果
  4. GetNewId=true,正常情况返回 新产生的自增ID