1、插入方式

1.1 单条插入实体

//返回插入行数
db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现
//异步: await db.Insertable(insertObj).ExecuteCommandAsync()
 
//插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)
db.Insertable(insertObj).ExecuteReturnIdentity();
//异步: await db.Insertable(insertObj).ExecuteReturnIdentityAsync();
 
//返回雪花ID 看文档3.0具体用法(在最底部)
long id= db.Insertable(实体).ExecuteReturnSnowflakeId();
 
//导航插入
//具体文档:https://www.donet5.com/Home/Doc?typeId=2430
 
//实用技巧1:获取数据库时间我们可以用   
var dbTime = db.GetDate();
//实用技巧2: 强制设置表名(默认表名来自实体) 
db.Insertable(insertObj).AS("table01").ExecuteCommand();
 
//更多返回值方法看 1.6

1.2 批量 插入实体 (4种)

//(1)、非参数化插入(防注入) 
//优点:综合性能比较平均,列少1万条也不慢,属于万金油写法,不加事务情况下部分库有失败回滚机质
//缺点:数据量超过5万以上占用内存会比较大些,内存小可以用下面2种方式处理
db.Insertable(List<实体>).ExecuteCommand()  
db.Insertable(List<实体>).PageSize(1000).ExecuteCommand() //新功能:分页插入 5.1.4.103-prevoew04+
//错误: db.Insertable<List<实体>>(List).ExecuteCommand()//<>里面不能是list
//正确: Insertable<实体>(List).ExecuteCommand() 
//正确: Insertable(List).ExecuteCommand() 
 
 
//(2)、参数化内部分页插入(底层是分页插入)
//优点:适合插入条数固定,并且条数较少,请求频繁高的功能(最大利用执行计划缓存)
//缺点:个别库500以上就开始慢了,要加事务才能回滚  
db.Insertable(List<实体>).UseParameter().ExecuteCommand()//5.0.3.8-Preview及以上版本支持(NUGET搜索勾上包括预览)
 
 
//(3)、大数据写入(特色功能:大数据处理上比所有框架都要快30%)
//优点:1000条以上性能无敌手
//缺点:不支持数据库默认值, API功能简单, 小数据量并发执行不如普通插入,插入数据越大越适合用这个
//新功能 5.0.44
db.Fastest<实体>().PageSize(100000).BulkCopy(List<实体>);//MySql连接字符串要加AllowLoadLocalInfile=true
//详细文档:https://www.donet5.com/Home/Doc?typeId=2404
 
 
//(4)、Into Select ,从一个表导入到另一个表 
//优点:性能好
//缺点:数据必须在数据库已存在,才能这样插入到新表
 
//例1:不同实体插入  
db.Queryable<Order>()
 //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了   
 .Select(it=>new { name=it.name,......})            
 .IntoTable<实体2>();
  
//例2: 同实体不同表插入    
db.Queryable<Order>()
 //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了
.IntoTable<Order>("新表名");

1.3 根据字典  插入

//可以是 Dictionary 或者 List<Dictionary >
var dc= new Dictionary<stringobject>();
            dc.Add("name""1");
            dc.Add("CreateTime", DateTime.Now);
db.Insertable(dc).AS("student").ExecuteCommand();

1.4 根据Datatable 插入

//方案1
List<Dictionary<string,object>> dc= db.Utilities.DataTableToDictionaryList(dataTable);//5.0.23版本支持
db.Insertable(dc).AS("student").ExecuteReturnIdentity();
 
//注意:5.0.7.7 以下存在BUG
//方案2 :直接用datatable插入
db.Fastest<System.Data.DataTable>().AS("order").BulkCopy(dataTable);
//具体用法 要看文档  https://www.donet5.com/Home/Doc?typeId=2404

1.5 匿名、Object、接口、抽象类插入

//1.匿名对象插入(最新)
db.InsertableByDynamic(new   { name="",price=1 })
                .AS("[Order]")
                .ExecuteCommand();
                 
//2.Object、接口、抽象类插入
//o必须是真实的类对象 (比如根据type反射出来的对象,或者转成了Object的实体)
 db.InsertableByObject(o).ExecuteCommand();
  
 
//3.更多功能 :动态建类等
https://www.donet5.com/Home/Doc?typeId=2562

1.6 插入返回值

方法名 描述
ExecuteCommand

注意:批量插入用该方法性能最好

返回数据库受影响的行数,例如查询返回0,更新0条返回0,更新1条返回1

新功能 (5.1.2.4 prview01 )

ExecuteReturnPkList<T>();

用例:

ExecuteReturnPkList<int>();

ExecuteReturnPkList<Long>();

ExecuteReturnPkList<Guid>();

批量返回主键

1、支持 批量返回自增 ,SqlServer和PgSql性能比较好(其它库性能差些)

2、支持返回雪花ID (等同于ExecuteReturnSnowflakeIdList)

3、支持返回GUID

不支持用触发器的主键

ExecuteReturnIdentity 返回单个自增列 (int)
ExecuteReturnBigIdentity 返回单个自增列 (long)
ExecuteReturnEntity 返回实体(如果有自增会返回到实体里面,不支批量自增,不支持默认值)
ExecuteCommandIdentityIntoEntity 给传入实体添加自增列  (不支持批量)
ExecuteReturnSnowflakeId 返回雪花ID 看文档 3.0用法    5.0.3.5支持
ExecuteReturnSnowflakeIdList 返回雪花ID集合 文档 3.0用法  5.0.3.5支持

2、功能案例

2.1 不插入指定字段

//忽略 name testid
db.Insertable(insertObj).IgnoreColumns(it => new { it.Name, it.TestId }).ExecuteReturnIdentity();
db.Insertable(insertObj).IgnoreColumns( "Name","TestId").ExecuteReturnIdentity();

2.2 只插入指定字段

//只插入 name schoolid 
db.Insertable(insertObj).InsertColumns(it => new { it.Name, it.SchoolId }).ExecuteReturnIdentity();
db.Insertable(insertObj).InsertColumns("Name","SchoolId").ExecuteReturnIdentity();

2.3 NULL列不插入

注意:因为插入的列不同不支持批量操作,如果有需要可以自已循环操作

db.Insertable(insertObj2).IgnoreColumns(ignoreNullColumn:true).ExecuteCommand();

2.4 异步

await Db.Insertable(new Order() { Name = "a", CustomId = 1 }).ExecuteCommandAsync();

2.5 级联、导航插入

新功能 5.0.9.2

db.InsertNav(list)
       .Include(z1 => z1.SchoolA)// 插入第一层 SchoolA
       .ThenInclude(z1 => z1.RoomList) //插入 SchoolA 下面的 RoomList
       .Include(z1 => z1.Books)//插入第一层  Books
       .ExecuteCommand();

实体配置:  https://www.donet5.com/Home/Doc?typeId=2430

2.6 大数据插入

//插入 100万 数秒时间
db.Fastest<RealmAuctionDatum>().BulkCopy(GetList());//性能 比现有任何Bulkcopy都要快30%
db.Fastest<RealmAuctionDatum>().PageSize(50000).BulkCopy(List<实体>);//大数据分页插

更多文档: https://www.donet5.com/Home/Doc?typeId=2404

//如果不支持可以用:普通分页插入 
db.Insertable(List<实体>).PageSize(1000).ExecuteCommand();//普通分页插入

2.7 插入默认值

方式1:如果数据库存在默认值用这个方法

public class Order
{
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { getset; }
 
        public string Name { getset; }
        public decimal Price { getset; }
        [SugarColumn(IsOnlyIgnoreInsert =true)]//设置后插入会取数据库默认值
        public DateTime CreateTime { getset; }
}

方式2 (5.1.3.41):通过特性指定默认值

  //InsertServerTime=true 插入取数据库当前时间 支持多库 
  //IsOnlyIgnoreUpdate=true 是指在Update操作不更新该列 (可用可不用根据需求来)
  [SugarColumn(InsertServerTime =true, IsOnlyIgnoreUpdate =true)]// getdate() now() sysdate
  public DateTime CreateTime { getset; }
   
   
  //插入根据SQL进行插入 
   [SugarColumn(InsertSql  = "getdate()")] //生成   getdate()
   public DateTime CreateTime2 { getset; }
  
   [SugarColumn(InsertSql  = "''")] // 生成  ''
   public string  Str { getset; }
    
   [SugarColumn(InsertSql  = "0")]// 生成  0
   public string  Str { getset; }

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

2.8  Guid主键自动赋值

只要设置为主键,并且C#类型是Guid 只要不传值,会自动赋值

注意只能用: ExecuteCommand 方法不能用自增列的方法

2.9 调用实体内方法

 var data=new  UnitInsertMethod(){ Name="a",Time=DateTime.Now};
 db.Insertable(data).ExecuteCommand();
 db.Updateable(data).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;
    }
 } 

3.0 雪花ID

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

3.1 强制插入自增列

需要数据库的支持才行,ORM只是把SQL中的 自增列 加上去了,有些需要写脚本

//请升级到:5.1.4.73-preview12
db.Insertable(insertObj).OffIdentity().ExecuteCommand() 
 
//老版本:SqlServer支持不友好
//db.Insertable(insertObj).IgnoreColumns(false,true).ExecuteCommand()

3.2 Into Select

//例1:不同实体插入 Select Into
db.Queryable<Order>()
 //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了   
 .Select(it=>new { name=it.name,......})            
 .IntoTable<实体2>();
   
//例2: 同实体不同表插入    
db.Queryable<Order>()
 //.IgnoreColumns(it=>it.Id) 如果是自增可以忽略,不过ID就不一样了
.IntoTable<Order>("新表名");

3.3 分页插入

可以用分页插入慢慢处理

db.Insertable(List<实体>).PageSize(1000).ExecuteCommand();//普通分页
db.Fastest<RealmAuctionDatum>().PageSize(100000).BulkCopy(GetList());//大数据分页

SqlSugar新增数据的更多相关文章

  1. Web jquery表格组件 JQGrid 的使用 - 8.Pager、新增数据、查询、刷新、查看数据

    系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...

  2. 使用Hibernate框架,新增数据后如何返回新增数据的全部信息

    一.需求描述:一个修改事物(TRANSACTION)先后包括子事物修改和子事物新增,修改事物完成后返回其子事物新增的全部数据  二.实现:若实现修改对象后还需要新增一个新对象,并返回新对象的需求,保存 ...

  3. SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能

    关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...

  4. mybatis入门篇:Mapper接口/关联查询/新增数据

    1.数据准备 2.编写实体类 package com.forest.owl.entity; import java.util.Date; public class User { private Lon ...

  5. ASP.NET新增数据返回自增ID

    一.情景引入 项目需求:对于一个数据表(表A)的增.删.改全部要有日志记录,日志表(表B)结构 中需要记录表A的自增ID,这样才能将日志与操作的数据一一对应起来. 对于删和改都好办,获取Model时都 ...

  6. mybatis学习之路----mysql批量新增数据

    原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...

  7. MyBatis基础入门《十三》批量新增数据

    MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...

  8. C#高效新增数据到数据库(十万级别测试)

    我们在对数据库进行新增数据时,怎么能把速度提到最快,时间缩到最短呢?下面针对三种方法进行比较 新增 逐条新增数据模式 Stopwatch s2 = new Stopwatch(); s2.Start( ...

  9. 【SQL Server】sql server更改了数据表的字段/新增数据表的字段 无法保存

    sql server更改了数据表的字段/新增数据表的字段  无法保存 解决方法:进入 工具-->选项-->Designers-->表设计器和数据库设计器-->取消勾选   即可

  10. Thinkphp5.0 获取新增数据的ID

    // 方法1 insertGetId方法新增数据并返回主键值使用getLastInsID方法: Db::name('user')->insert($data); $userId = Db::na ...

随机推荐

  1. python像操作文件一样操作内存的模块 StringIO

    io流(io stream) 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插 ...

  2. AtCoder ARC 115 E - LEQ and NEQ (延迟标记线段树 or 笛卡尔积 + DP维护)

    问题链接:Here 长度为 \(N\) 的数列 \(A_1,-,A_N\) .回答满足以下条件的长度 \(N\) 的数列 \(X_1,-,X_N\) 的个数除以 \(998244353\) 的余数. ...

  3. Codeforces Round #736 (Div. 2) A~D

    比赛链接:Here 1549A. Gregor and Cryptography 不难,观察一下就容易得知要想使得 \(p\pmod a = p\pmod b\) 令 \(a = 2,b=p - 1\ ...

  4. AtCoder Beginner Contest 204 (AB水题,C题DFS,D题位运算DP,E题BFS好题)

    补题链接:Here A - Rock-paper-scissors 石头剪刀布,两方是一样的则输出该值,否则输出该值 int s[4] = {0, 1, 2}; void solve() { int ...

  5. Windows环境下,解决无法使用ping命令

    众所周知,ping命令是个非常实用的网络命令:有时,我们会发现在电脑中无法使用ping命令,一般来说,是由于电脑的环境变量出了问题,本文将介绍如何解决这个问题. 1.一般出现ping命令无法使用的情况 ...

  6. 深度学习基础课:使用交叉熵损失函数和Softmax激活函数(下)

    大家好~本课程为"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放 加QQ群,获得 ...

  7. 多倍图切图cutterman

  8. java进阶(12)--8种数据包装类型、Integer、常用方法

    一.基本数据类型与包装类型 8种基本数据类型,对应的包装类,父类 1.byte-->java.lang.Byte-->Number 2.short-->java.lang.Short ...

  9. /etc/profile,/etc/bashrc,~/.profile,~/.bashrc 的区别及使用

    转载请注明出处: /etc/profile  为系统的全局环境变量设置,此文件为系统的每个用户设置环境信息    /etc/bashrc 为每一个运行bash shell的用户执行此文件.当bash ...

  10. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.26)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...