SqlSugar新增数据
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< string , object >(); 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 { get ; set ; } public string Name { get ; set ; } public decimal Price { get ; set ; } [SugarColumn(IsOnlyIgnoreInsert = true )] //设置后插入会取数据库默认值 public DateTime CreateTime { get ; set ; } } |
方式2 (5.1.3.41):通过特性指定默认值
//InsertServerTime=true 插入取数据库当前时间 支持多库 //IsOnlyIgnoreUpdate=true 是指在Update操作不更新该列 (可用可不用根据需求来) [SugarColumn(InsertServerTime = true , IsOnlyIgnoreUpdate = true )] // getdate() now() sysdate public DateTime CreateTime { get ; set ; } //插入根据SQL进行插入 [SugarColumn(InsertSql = "getdate()" )] //生成 getdate() public DateTime CreateTime2 { get ; set ; } [SugarColumn(InsertSql = "''" )] // 生成 '' public string Str { get ; set ; } [SugarColumn(InsertSql = "0" )] // 生成 0 public string Str { get ; set ; } |
方式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 { get ; set ; } public string Name { get ; set ; } public DateTime Time { get ; set ; } [SqlSugar.SugarColumn(IsNullable = true )] public string UserId { get ; set ; } 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()); //大数据分页 |