首页 > 数据库 >SqlSugar更新数据

SqlSugar更新数据

时间:2024-01-16 15:14:58浏览次数:28  
标签:Name ExecuteCommand db 更新 Updateable var 数据 SqlSugar

1、根据实体对象更新

所谓按实体对象更新就是:db.Updateable(参数对象) 有参数的重载

db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单

优点

1、代码少

2、支持各种批量修改

缺点

1、不支持表达式和sql函数

2、依赖 实体对象 ,没实体对象就需要手动构造

 1.1 单条与批量

根据实体更新需要给实体配置主键,参考文档实体配置

//根据主键更新单条 参数 Class var result= db.Updateable(updateObj).ExecuteCommand();//实体有多少列更新多少列     //批量更新参数 List<Class> var result= db.Updateable(updateObjs).ExecuteCommand(); //分页更新 5.1.4.129+ 低版本 存在 UpateColumns设置无效 db.Updateable(List<实体>).PageSize(1000).ExecuteCommand()      var updateObj=new Class(){Id=1 }; //主键要有值 //只更新修改字段 (5.1.4.59支持了批量) db.Tracking(updateObj);//创建跟踪 updateObj.Name = "a1" + Guid.NewGuid();//只改修改了name那么只会更新name db.Updateable(updateObj).ExecuteCommand();//因为每条记录的列数不一样,批量数据多性能差,不建议用 //可以清空 db.ClearTracking();//5.1.4.108-preview30+      //大数据批量更新  适合列多数据多的更新   db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());   //联表更新看标题6.2

 

函数 说明
ExecuteCommand  返回受影响行数 , update where 如果没找到那么就会返回 0
ExecuteCommandHasChange 返回bool  ,等同于  bool isChange= ExecuteCommand()>0 

 

 1.2 不更新某列

不更新 TestId和CreateTime

var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand()

 1.3 只更新某列

只更新 Name 和 CreateTime 

var result=db.Updateable(updateObj).UpdateColumns(it => new { it.Name,it.CreateTime }).ExecuteCommand();   //注意:5.1.4.62版本支持了多个UpdateColumn叠加,之前版本不支持

 追加AOP赋值列 5.1.4.106-preview19+

//例如:AOP修改 Price那么更新的列就是 Price Name Creatime 加了true就追加了一列 var result=db.Updateable(updateObj) .UpdateColumns(it => new { it.Name,it.CreateTime },true)//true表示追加AOP赋值列 .ExecuteCommand();

 

1.4 NULL列不更新

注意:高版本支持批量 ,用该方法批量性能差些,因为列不同所以没必然用批量语法

//更新忽略null字段 db.Updateable(data).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();   //更新忽略null并且忽略默认值 (比如int默认值是0就不更新) db.Updateable(data).  IgnoreColumns(ignoreAllNullColumns:true,ignoreAllDefaultValue:true).ExecuteCommand();

 1.5 无主键/指定列

 用法同上唯一区别就是用WhereColumns指定条件

var result= db.Updateable(updateObj).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新单 条根据ID var result= db.Updateable(updateObjs).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新集合根据ID by id

可以多列 

WhereColumns(it=>new { it.Id,it.Name}) //条件列不会被更新,只会作为条件

 1.6 更新添加条件

注意:单条操作都支持 

db.Updateable(updateObj).Where(it=>it.Id==1).ExecuteCommand() //如果是集合操作请更新到5.0.4版本之前版本禁止使用, 并且只有部分库支持

 

 1.7 大数据更新 5.0.4.5

//大数据更新,适合大数据更新,可以处理百万级 db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//特色功能:吊打所有框架N倍,30列100万8秒更新完

 

 1.8 重新赋值1:list中的值修改

请升级新版本 ,老版本存在BUG,所以没公开这个函数

 //单个字段  db.Updateable(updateObj)              .ReSetValue(it=> { it.Name = it.Name+"a";})  // updateObj.Name值的基础上在处理             .ExecuteCommand()   //多个字段             db.Updateable(updateObj)              .ReSetValue(it=> {                        it.Name = it.Name+"a";                       it.CreateTime = DateTime.Now;                      })                .ExecuteCommand()               //注意:该功能是在UpdateObj参数上修改,如果是在数据库字段+1 看1.9和2.3

 

 1.9 重新赋值2: 列中的值+1

 (1)  SET=字段+固定变量  SqlSugarCore 5.1.4.72 +

  var result67 =           db.Updateable(updateObjs)           //批量更新单独处理num列 set num=num+1           .PublicSetColumns(it => it.Num, it => it.Num+ 1)           .ExecuteCommand();   //该功能默认是更新整个LIST,如果只更新一个字段需要加UpdateColumn指定一下                     //2.3也有该功能不过是针对表达式方式更新,不是通过实体方式

 (2)  SET=字段+集合变量 SqlSugarCore 5.1.4.77 preview02 +

   db.Updateable(list)    .PublicSetColumns(it => it.Price, "+"//set price=price+list[i].price    .ExecuteCommand();          //,该功能默认是更新整个LIST,如果只更新一个字段需要加UpdateColumn指定一下

 

 

2、 根据表达式更新(像SQL)

这种无参数重载我们称为表达式更新,他不依赖实体或者集合参数  db.Updateable<Student>() 

db.Updateable<Student>().SetColumns(...).Where(...).ExecuteCommand()//正确没参数我们称为表达式更新  db.Updateable(实体或者集合).SetColumns(...).Where(...).ExecuteCommand()//错误 如果带有参数 实体或者集合 看标题1 //注意:一定要看右边菜单 1和2的用法不要用混了

优点

1、需要更新什么写什么

2、支持SqlFunc函数也支持字段相加比如 Num=it.Num+1

缺点

1、不支持批量更新不同记录,只支持批量更新统一的结果 

2、没有实体更新节约代码

根据表达式更新和上面的实体更新有着本质的区别,实体更新是要处理实体里面哪些字段要更新哪些不要更新

表达式则是需要更新什么写什么,哪种方式都可以就看你喜欢哪一种

 2.1 指定多个字段更新

更新 name,createtime 条件id=11

var result= db.Updateable<Student>() .SetColumns(it => new Student() { Name = "a", CreateTime = DateTime.Now })//类只能在表达示里面不能提取 .Where(it => it.Id == 11) .ExecuteCommand(); //表达式写2列更新2列,其他不会更新

 2.2 一个字段更新

只更新 name 条件id=1 

var result= db.Updateable<Student>() .SetColumns(it => it.Name == "jack")//SetColumns是可以叠加的 写2个就2个字段赋值 .Where(it => it.Id == 1) .ExecuteCommand();   // Sql  // Update Student  set Name='jack' where id=1    //如果需要获取数据库时间我们可以用 SqlFunc.GetDate()

 2.3 字段+1更新

//实现在原有字段+1 var result= db.Updateable<Student>() .SetColumns(it => it.Num== it.Num+1) .Where(it => it.Id == 1) .ExecuteCommand(); // update Studentset iNum=iNum+1 where id=1

 2.4 Set语法是支持多个的

var result71 = db.Updateable<Order>()                //生成 [name]=name               .SetColumns(it => it.Name == it.Name)//加一个必须更新条件防止SETIF没有列               //第一条件为true 生成 createtime=变量                .SetColumnsIF(p!=null ,it => it.CreateTime == p.Value)                //第一条件为true 生成 X=变量                .SetColumnsIF(X!=null ,it => it.X== X)             .Where(it => it.Id == 11).ExecuteCommand();

 2.5 批量更新IN

var ids=new int[]{1,2,3}; var result71 = db.Updateable<Order>()              .SetColumns(it => it.Name == "a")             .Where(it => ids.Contains(it.Id)).ExecuteCommand();             // in (1,2,3)

 2.6表达式无实体更新

  db.Updateable<object>()                 .AS("Order")                 .SetColumns("name", 1)                 .Where("id=1").ExecuteCommand();                     //SQL:   //UPDATE [Order]  SET   //         [Name]=@Const0  WHERE id=1

 

3、根据字典更新

//字典 var dt = new Dictionary<stringobject>();             dt.Add("id", 1);             dt.Add("name"null);             dt.Add("createTime", DateTime.Now); var t66 = db.Updateable(dt).AS("student").WhereColumns("id").ExecuteCommand();   //字典集合 var dtList = new List<Dictionary<stringobject>>(); dtList.Add(dt); dtList.Add(dt2); var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();     //

 

4、根据DataTable更新

将datatable转成字典集合插入

List<Dictionary<string,object>> dc= db.Utilities.DataTableToDictionaryList(dataTable);//转成字典 var t666 = db.Updateable(dc).AS("student").WhereColumns("id").ExecuteCommand();

 

5、匿名、Object、接口和抽象类更新

匿名对象:

https://www.donet5.com/Home/Doc?typeId=2423

 

Object、接口和抽象类:

//这个object必须真实类对象,比如反射的Object 或者接口接收的类对象 db.UpdateableByObject(object).ExecuteCommand();   //更多功能 :动态建类等 https://www.donet5.com/Home/Doc?typeId=2562

 

6、更多功能

6.1 更新主键

ORM默认不支持修改主键,这种需求有2种方案

1、删除当前记录,然后在添加一条新记录(因为主键都可以更新,说明没有外部引用,可以直接删掉在加)

2、新建一个没有主键的实体,指定表名用Wherecolumns更新

6.2 联表更新

//多库兼容 var t17 = db.Updateable<Student>()         .SetColumns(it =>new Student()                    SchoolId=SqlFunc.Subqueryable<School>().Where(s=>s.Id ==it.SchoolId).Select(s=>s.Id),             Name = "newname"            })          .ExecuteCommand();       //也可以在Where加条件       //.Where(it => SqlFunc.Subqueryable<School>().Where(s => s.Id == it.SchoolId).Any())            //优雅写法:MySql PgSql SqlServer Oracle 达梦、金仓   //其中Oracle和达梦只支持2表      var t= db.Updateable<Order>()         .InnerJoin<Custom>((x, y) => x.CustomId == y.Id)           .SetColumns((x, y) => new Order() { Name = y.Name, Price = y.Id })           .Where((x, y) => x.Id == 1)           .ExecuteCommand();

sql

UPDATE [STudent]  SET             [SchoolId] = (SELECT TOP 1 [Id] FROM [School] WHERE ( [Id] =[STudent].[SchoolId] )) ,              [Name] = @Const0    WHERE ( [ID] = @Id1 )

6.3  调用实体内方法

 db.Insertable(new UnitInsertMethod() { ...... })  .CallEntityMethod(it=>it.Create()).ExecuteCommand();     db.Updateable(new UnitInsertMethod() { ..... })  .CallEntityMethod(it => it.modify("admint")).ExecuteCommand();   //实体  public class UnitInsertMethod {     [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]     public int Id { getset; }     public string Name { getset; }     public DateTime Time { getset; }     [SqlSugar.SugarColumn(IsNullable =true)]     public string UserId { getset; }        public void Create()     {         this.Time = DateTime.Now;         this.UserId = "1";     }     public void modify(string a)     {         this.Time = DateTime.Now;         this.UserId = a;     } } 

 

6.4 高性能更新 

适合超大数据更新

db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//更新 吊打所有框架N倍,30列100万8秒更新完

 

6.5 导航更新

https://www.donet5.com/Home/Doc?typeId=2432

 

6.5 默认值

方式1 (5.1.3.42-preview01):通过特性指定默认值

  //更新取数据库当前时间 支持多库   //UpdateServerTime =true 更新的时候取服务器时间   //IsOnlyIgnoreInsert =true 插入的时候不插入该列(可用可不用根据需求来)   [SugarColumn(UpdateServerTime =true,IsOnlyIgnoreInsert =true)]// getdate() now() sysdate   public DateTime UpdateTime { getset; }           //更新根据SQL进行插入     [SugarColumn(UpdateSql  = "getdate()")] //生成   getdate()    public DateTime UpdateTime2 { getset; }       [SugarColumn(UpdateSql  = "''")] // 生成  ''    public string  Str { getset; }         [SugarColumn(UpdateSql  = "0")]// 生成  0    public string  Str { getset; }         [SugarColumn(UpdateSql  = "num+1")]// 生成  num+1      public string  num { getset; }

注意: 

表达更新:SetColumns(it=>new class{ name=it.name},true) 如果用到SetColumn需要加个true

实体更新:无需任何操作

方式2:通过AOP实现,文档搜索:AOP  , 看标题2

注意:方式1和方式2不要冲突了

标签:Name,ExecuteCommand,db,更新,Updateable,var,数据,SqlSugar
From: https://www.cnblogs.com/yswenli/p/17967691

相关文章

  • SqlSugar删除数据
    1、根据实体删除1.1强类型实体 需要配置主键,根据主键删除需要给实体配置主键,参考文档实体配置//单个实体db.Deleteable<Student>(new Student() { Id = 1 }).ExecuteCommand(); //List<实体> (可以不加Where)List<Student> list=new List<Student>(){......
  • 数据库高可用方案
    MySQL高可用架构MySQL高可用架构主要包括:主从复制(Master-SlaveReplication):通过将主数据库的更改同步到一组从数据库来实现高可用性。当主数据库宕机时,从数据库可以被提升为新的主数据库。主主复制(Master-MasterReplication):两个或多个主数据库相互同步,每个主数据库都可以处理......
  • SqlSugar基础查询
    查所有List<Student> list=db.Queryable<Student>().ToList()//select * from Student查询总数int count=db.Queryable<Student>().Count()//select count(1) from Student按条件查询db.Queryable<Student>().Where(it=>it.Id......
  • SqlSugar分组查询
    一、分组查询和使用1.1语法只有在聚合对象需要筛选的时候才会用到Having,一般分组查询用不到可以去掉  var list = db.Queryable<Student>()             .GroupBy(it => new { it.Id, it.Name }) //可以多字段             .Whe......
  • SqlSugar分页查询
    同步分页 int pagenumber= 1; // pagenumber是从1开始的不是从零开始的 int pageSize = 20; int totalCount=0; //单表分页 var page = db.Queryable<Student>().ToPageList(pagenumber, pageSize, ref totalCount); //如果SqlServer不想有Rownumb......
  • SqlSugar联表查询
    Join用法语法糖1、2和3在WhereOrderByGroupBySelect用法都一样的,他们区别就在JOIN的方式不一样,其它都一样语法糖1  优点:好理解,5个表以内的联表非常爽,支持功能全缺点: 联表超过5个以上的表后(x,b,c...) 会比较难看,语法糖2可以弥补表和表的左连接  新语法糖 5.0.......
  • 使用shell脚本xtrabackup自动恢复MySQL数据库
    【背景说明】按照安全的一些要求,需要定期对数据库进行恢复演练操作【环境说明】MySQL5.7的xtrabackup全库xbstream的加密备份(如果不是流备份跟加密,去掉相关参数)【脚本说明】v_backupdir="/mysqlbackup/recovery/yiyuan"备份文件的目录路径v_dir="/mysqlbackup/recovery/......
  • js将数据转为菜单,一个for?
    letdata=[{id:'02',lable:'产品leader',pid:'01'},{id:'03',lable:'UIleader',pid:'01'},{id:'07',lable:'产品经理',pid:'02'},{id......
  • SqlSugar入门
    SqlSugar入门创建对象你可以使用SqlSugarClient(new模式)或者 SqlSugarScope(单例) 对数据库进行增、删、查、改等功能注意:除了名字和使用模式不同,功能和API都一模一样SqlSugarClient(new模式)优点:性能比SqlSugarScope有5%左右提升缺点:db不能跨上下文使用,需要new......
  • 处理跨域请求的API接口数据
     在Web开发中,跨域请求是一个常见的问题。由于浏览器的安全策略限制,JavaScript在发送HTTP请求时只能访问同源下的资源,即协议、域名、端口号都必须一致。然而,有时我们需要从不同域名下获取数据,这就涉及到了跨域请求的问题。为了解决这个问题,我们可以使用API接口来处理跨域请求。......