上一篇介绍了Rainbow的Create方法, 这里就来介绍一下Update方法吧, 毕竟新增和修改是双胞兄弟嘛.

一、Update

1. 测试代码:

var conStr = ConfigurationManager.ConnectionStrings["Cons"].ToString();
using (var conn = new MySqlConnection(conStr))
{
var db = Rainbow.Init(conn, ); try
{
db.BeginTransaction(); for (int i = ; i < ; i++)
{
var res = db.Teacher.Update(i + , new
{
//BId = Guid.NewGuid().ToString(),
//CreateDate = DateTime.Now,
// IsDoublePosition = Convert.ToBoolean(i % 2),
Name = "Xixi" + i,
No = (i * + i).ToString(""),
//Sex = i % 2
});
}
db.CommitTransaction();
}
catch
{
db.RollbackTransaction();
Console.WriteLine("Error happened");
}
}

使用方法和Insert方法类似, Update方法由两个参数, 第一个参数是Id, 第二个参数是dynamic data, 如果你不想更新全部的列, 只需要新建一个实体, 里面只包含你想更新的列就行了, 这样做, 不会修改到别的列.

结果:

2. 源码解析

/// <summary>
/// Update a record in the DB
/// </summary>
/// <param name="id"></param>
/// <param name="data"></param>
/// <returns></returns>
public int Update(TId id, dynamic data)
{
List<string> paramNames = GetParamNames((object)data); var builder = new StringBuilder();
builder.Append("update ").Append(TableName).Append(" set ");
builder.AppendLine(string.Join(",", paramNames.Where(p => p != "Id").Select(p => p + "= @" + p)));
builder.Append(" where " + "Id" + " = @Id"); DynamicParameters parameters = new DynamicParameters(data);
parameters.Add("Id", id); return database.Execute(builder.ToString(), parameters);
}

Dapper这里是通过反射传入参数data, 来提取其中的字段名称, 生成一个List<string>集合, 然后根据这个集合去拼接sql语句.

如果你的框架中, 数据库设计遵循的规则, 有CreateBy, CreateTime字段, 在我们获取到实体时, 就是Tch_Teacher的格式, 但是我们又不想再写一遍new{}, 或者dynamic obj = new ExpandoObject()的时候, 就可以从Update方法入手, 修改一下就可以省下许多事情.

 builder.AppendLine(string.Join(",", paramNames.Where(p => p != "Id" && p != "CreateBy" && p != "CreateTime").Select(p => p + "= @" + p)));

二、Delete

1. 测试代码

var conStr = ConfigurationManager.ConnectionStrings["Cons"].ToString();
using (var conn = new MySqlConnection(conStr))
{
var db = Rainbow.Init(conn, ); try
{
db.BeginTransaction(); for (int i = ; i < ; i+=)
{
var res = db.Teacher.Delete(i);
} db.CommitTransaction();
}
catch
{
db.RollbackTransaction();
Console.WriteLine("Error happened");
}
}

删除方法就很简单了, Rainbow只提供了一个根据主键删除的方法, 这里可以扩展成Update的那种方式, 可以根据所传入的字段来匹配删除数据

2. 源码解析

先看Rainbow的源码, 这里就没有什么好说明的了

/// <summary>
/// Delete a record for the DB
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool Delete(TId id)
{
return database.Execute("delete from " + TableName + " where " + "Id" + " = @id", new { id }) > ;
}

下面来看一下, Delete的订制扩展方法

/// <summary>
/// 自定义删除方法
/// 根据传入字段来删除数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public bool Delete(dynamic data)
{
List<string> paramNames = GetParamNames((object)data);
var builder = new StringBuilder();
builder.Append("delete from ").Append(TableName).Append(" where ");
builder.Append(string.Join(" and ", paramNames.Select(n => n + "=@" + n)));
return database.Execute(builder.ToString(), data) > ;
}

这里的删除, 都是 and 连接, 如果想要 or , instr()>0 方式的, 那就只有自己写sql了, 这里并不提供此类方法

/// <summary>
/// Delete a record for the DB
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool DeleteWhere(string where, dynamic param = null)
{
string wherestr = "";
if (!string.IsNullOrEmpty(where))
wherestr = " where " + where;
return database.Execute("delete from " + TableName + wherestr, param) > ;
}

可以自己写一个, 只要给条件就行了, 不过这个方法是有蛮大风险的, 如果where为空, 会清空表

Dapper学习 - Dapper.Rainbow(二) - Update/Delete的更多相关文章

  1. Dapper学习 - Dapper.Rainbow(三) - Read

    前面已经介绍了新增/修改/删除了, 接下来介绍一下Rainbow的Read方法. 一.Read -- Rainbow原生 1. 先看测试代码 var conStr = ConfigurationMan ...

  2. Dapper学习 - Dapper.Rainbow(一) - Create

    Dapper这个ORM有许多扩展, 我自己用过两种, 也算是比较主流的两种, Rainbow和Extension, 这里就先介绍下Rainbow吧, 毕竟这个先用, 当然, 由于我使用的是mysql数 ...

  3. Dapper学习 - Dapper的基本用法(二) - 存储过程/函数

    上一篇貌似少介绍了自定义函数和存储过程, 因为这两个也可以使用查询的方式来实现功能, 这一篇就补上 一.自定义函数的创建和调用 (mysql的) Delimiter $$ drop function ...

  4. Dapper学习 - Dapper的基本用法(三) - CUD

    之前介绍了Dapper的查询, 存储过程, 函数的调用, 接下来要说一下Dapper的增删改, 其实Dapper的增删改, 都是同一种模式的. 我就不分开介绍了, 直接在一个例子上展现好了. var ...

  5. Dapper学习 - Dapper的基本用法(一) - 查询

    上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面 ...

  6. [转载][QT][SQL]sql学习记录3_sqlite之update delete like

    转载自:详见 : http://www.runoob.com/sqlite/sqlite-create-table.html 约束表实例 下面是一个实例,它创建了一个 COMPANY 表,ID 作为主 ...

  7. Entity Framework with MySQL 学习笔记一(insert,update,delete)

    先说说 insert 吧. 当EF执行insert时,如果我们传入的对象是有关联(1对多等)的话,它会执行多个语句 insert到多个表, 并且再select出来填充我们的属性(因为有些column默 ...

  8. dapper 扩展插件: Rainbow

    dapper 扩展插件: Rainbow dapper 是一个效率非常高的orm  框架 ,效率要远远大于 我们大微软的EF .    它只有一个类文件,非常之小. 1,首先下载dapper  这里下 ...

  9. dapper 学习

    上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面 ...

随机推荐

  1. 成都亚马逊AWSome Day回顾

    6月25日我和公司同仁一起参加了亚马逊在成都的第一场AWSome Day活动.整个活动时间异常紧促,短短一天包含了7堂session,讲师的狂轰乱炸使得我们同学们普遍觉得比上班累多了.好了,废话不多说 ...

  2. Repeater绑定数组并显示其值

    web开发中,尤其是对于数据展示,不得不说Repeater是一个万能的控件,而且使用也很方便. 在ASP.NET中将数组绑定到Repeater中请问如何在Repeater前台页面中显示该数组的值? s ...

  3. Java-数组练习5

    5.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行.请采用循环控制语句来实现. (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和.) 1 1   1 ...

  4. 我的Eclipse快捷键.

    所谓“工欲善其事必先利其器”,程序写多了,对于快捷键总有些特别的偏爱.在众多编辑器中,Eclipse算是用的比较多,也是最熟的. 最常用(也是最爱的:)) Ctrl+’ :  自动完成提示.这个快捷键 ...

  5. Atitit 函数式编程与命令式编程的区别attilax总结  qbf

    Atitit 函数式编程与命令式编程的区别attilax总结  qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...

  6. Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic

    Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic 1.1. ThreadLocal 设计模式1 1.2. ...

  7. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

  8. 搭建LNAMP环境(四)- 源码安装PHP7

    上一篇:搭建LNAMP环境(三)- 源码安装Apache2.4 一.安装PHP7 1.yum安装编译php需要的包 yum -y install libxml2 libxml2-devel curl- ...

  9. 每天一个linux命令(29):chgrp命令

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  10. jquerymobile仿微信 - 01

    jquerymobile仿微信 - 01 jquerymobile的组件感觉不咋地哇 本地调试最好是开一个web server,不然数据访问会有问题 <div data-role="p ...