插入用法、新增数据 ,添加数据

学前小知识

没用过雪花ID可以看一下  插入 插入  插入 插入 插入 插入 插入 插入 插入 插入 插入 插入 插入

雪花ID重复 插入

用雪花ID一定要设置WORKID , 只要静态变量SnowFlakeSingle不能共享的情况都要有独的WorkId

养成良好习惯服务器上的WorkId和本地不要一样,并且多服务器都要设置不一样的WorkId

SnowFlakeSingle.WorkId= 唯一数字; //从配置文件读取一定要不一样
//服务器时间修改一定也要修改WorkId

雪花ID前端精度丢失

javascript 精度long没有19位长度,所以序列化雪花ID时要序列化成string  文档3.0 有详细介绍


1、插入方式

1.1 插入 单条

//返回插入行数
db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现

//插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)
db.Insertable(insertObj).ExecuteReturnIdentity();

//返回雪花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 批量 插入

//(1)、非参数化插入(防注入) 
//优点:综合性能比较平均,列少1万条也不慢,属于万金油写法,不加事务情况下部分库有失败回滚机质
//缺点:数据量不要超过5万,底层没有分批处理(原因:最大化利用数据库自带的一致性)
db.Insertable(List<实体>).ExecuteCommand()  


//(2)、使用参数化内部分页插入
//优点:500条以下速度最快,兼容所有类型和emoji,10万以上的大数据也能跑,就是慢些,内部分批量处理过了。
//缺点:500以上就开始慢了 (Oracle中500以上性能比第一种强),要加事务才能回滚 
db.Insertable(List<实体>).UseParameter().ExecuteCommand()//5.0.3.8-Preview及以上版本支持(NUGET搜索勾上包括预览)


//(3)、大数据写入(特色功能:大数据处理上比所有框架都要快30%)
//优点:1000条以上性能无敌手
//缺点:不支持数据库默认值, API功能简单, 小数据量并发执行不如普通插入,插入数据越大越适合用这个
//新功能 5.0.44
db.Fastest<RealmAuctionDatum>().BulkCopy(GetList());//MySql连接字符串要加AllowLoadLocalInfile=true
//Fastest详细文档:https://www.donet5.com/Home/Doc?typeId=2404(WinForm必看)

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 匿名对象 插入

db.Insertable<Dictionary<string,object>>(new   { name="",price=1 })
                .AS("[Order]")
                .ExecuteCommand();

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


老的多级插入: http://donet5.com/Ask/9/11125


2.6 大数据插入

//插入 100万 数秒时间
db.Fastest<RealmAuctionDatum>().BulkCopy(GetList());//性能 比现有任何Bulkcopy都要快30%

高性能写入 https://www.donet5.com/Home/Doc?typeId=2404

//分页插入 ,如果不支持db.Fastest分页插入也是可以提升一下性能的
db.Utilities.PageEach(allList, 100 ,pageList=> {
  db.Insertable(pageList).ExecuteCommand();
  //db.Insertable(List<实体>).UseParameter().ExecuteCommand() 可以试试和上面哪个性能高用哪个
});

2.7 插入默认值

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.8  Guid主键自动赋值

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

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


2.9 调用实体内方法

 db.Insertable(new UnitInsertMethod() { Name = "1" }).CallEntityMethod(it=>it.Create()).ExecuteCommand();
 db.Updateable(new UnitInsertMethod() { Name = "1" }).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

用法

  public class 实体
   {
        [SugarColumn(IsPrimaryKey =true)]//long类型的主键会自动赋值
        public long Id { get; set; }
 
        public string Name{get;set; }
   }
  long id= db.Insertable(实体).ExecuteReturnSnowflakeId();//单条插入返回雪花ID
  List<Long> ids = db.Insertable(List<实体>).ExecuteReturnSnowflakeIdList();//多条插入批量返回,比自增好用

多服务器写入

多个服务器插入的情况下  程序启动时加上

SnowFlakeSingle.WorkId= 唯一数字;

多个应用写入

比如一个程序发布了2个端口,那么就需要不同端口是不同的WORKID

SnowFlakeSingle.WorkId= 唯一数字;

服务器时间修改

SnowFlakeSingle.WorkId=修改一个新的没用过的数字;

序列化转换

注意序列化给前端时需要将Iong变成字符串,前端数字长度不够

[Newtonsoft.Json.JsonConverter(typeof(ValueToStringConverter))] //JsonConverter的命名空间不要搞错了
[SugarColumn(IsPrimaryKey =true)] 
 public long Id { get; set; }
 
//配置API使用JSON.NET
//Nuget安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
   services.AddControllers().AddNewtonsoftJson(opt =>
   {
                //忽略循环引用
                opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
 
                //不改变字段大小
                opt.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
    });

手动调用

比如需要唯一值什么的也可以直接用调用底层生成雪花的方法

SnowFlakeSingle.Instance.NextId()


3.1 插入AOP处理默认值

看第2条数据过滤器  https://www.donet5.com/Home/Doc?typeId=1204  

可以实现给多个字段插入前修改值


3.2 强制插入自增列

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

db.Insertable(insertObj).IgnoreColumns(false,true).ExecuteCommand()

3.3 Select * into (SqlServer )

 using (db.Ado.OpenAlways())//长连接
 {
     db.Queryable<Order>().Select(" * into #temp").ToList();//插入临时表
      var tempList=db.Queryable<dynamic>().AS("#temp").ToList();//查询临时表
 }


文档:SqlSugar5.0