1、使用SqlSugar的分表功能时,.net要使用.net core;
我开始使用的是.net freamwork4.72,程序报异常,没能解决,换到.net core下面就正常;
2、SqlSugar自带分表支持按季度、月、周、日进行分表;
3、定义实体类对象时,主键不能是自增列、不能是int;主键支持long或guid:
[SplitTable(SplitType.Day)]//按天分表[SugarTable("t温度监测表_{year}_{month}_{day}")]//3个变量必须要有,这么设计为了兼容开始按年,后面改成按月、按日public class TemperatureMonitor{[SugarColumn(IsPrimaryKey = true)]public long Id { get; set; }[SugarColumn(ColumnName = "监测点", ColumnDataType = "nvarchar", Length = 500)]public string Name { get; set; }[SplitField]//分表字段 ,在插入的时候会根据这个字段插入哪个表,在更新删除时用这个字段找出相关表[SugarColumn(ColumnName = "记录时间")]public DateTime CreateTime { get; set; }[SugarColumn(ColumnName = "外部温度")]public double OutSiderTemperature { get; set; }[SugarColumn(ColumnName = "内部温度")]public double InnerTemperature { get; set; }public override string ToString(){return $"{CreateTime.ToString("yyyy-MM-dd HH:mm:ss")}\t{Name}\t外部温度={OutSiderTemperature}\t内部温度={InnerTemperature}";}}
4、通过代码创建数据表
// 使用时
var db = new SqlSugarScope(new ConnectionConfig()
{ConnectionString = "connection_string",DbType = DbType.SqlServer,IsAutoCloseConnection = true,InitKeyType = InitKeyType.Attribute // 从实体特性中读取主键自增列信息
});
SqlSugar.SqlSugarScope db = BllDB.GetDB(); //根据TemperatureMonitor类定义,创建对应的数据表
db.CodeFirst.SetStringDefaultLength(200) //设置字符串类型的默认长度是200.SplitTables() //标识分表.InitTables<TemperatureMonitor>(); //如果数据库里没有这张表,就会自动新建一张
5、写数据到分表中
public static bool WriteData(List<TemperatureMonitor> monitors, out string error){error = null;try{var db = BllDB.GetDB(); long y = db.Insertable(monitors).SplitTable() .ExecuteReturnSnowflakeId();//写入数据并返回雪花ID,并自动赋值ID列return true;}catch (Exception ex){error = ex.Message;}return false;}
6、查询数据
//根据分表字段,确定对应的数据在哪张数据表上
TemperatureMonitor temp = new TemperatureMonitor() { CreateTime = DateTime.Parse("2014-12-03 15:35:35.983") };
var tb= db.SplitHelper(temp).GetTableNames(); //根据temp对象的分表字段信息,查询对应的数据在哪张分表上
//查询符合条件(对象的Name==name)的所有数据 monitors = db.Queryable<TemperatureMonitor>().Where(it => it.Name == name)//用Name属性进行过滤.SplitTable(tab => tab) //查询所有分表.ToList();
//只查询最近的一张表
var db = BllDB.GetDB();
monitors = db.Queryable<TemperatureMonitor>().SplitTable(tab => tab.Take(1)) //最近一张表.Where(it => it.Name.Equals(name)).ToList();
//查询特定时间段内,Name==name的数据
var db = BllDB.GetDB();
monitors = db.Queryable<TemperatureMonitor>().SplitTable(begintime,endtime) //通过时间查询(会自动生产CreateTime的过滤并找到对应时间的表).Where(it => it.Name.Equals(name)).ToList();
8、编辑数据
//修改Id=1808349695190372352的数据的数据值
db.Updateable<TemperatureMonitor>().SetColumns(it => new TemperatureMonitor(){OutSiderTemperature = 222,InnerTemperature = 11}).Where(it => it.Id == 1808349695190372352).SplitTable(tab => tab).ExecuteCommand();
9、删除数据
//删除根据Id删除数据
id = 1808404206764298259;
int cnt = db.Deleteable<TemperatureMonitor>().In(id).SplitTable(tab => tab).ExecuteCommand();
//直接根据实体集合删除 (全自动 找表插入)db.Deleteable(deleteList).SplitTable() //SplitTable不能少.ExecuteCommand();
10、补充——insert时关于PK的处理
//雪花IDdb.Insertable(data).SplitTable().ExecuteReturnSnowflakeIdList();//插入并返回雪花ID并且自动赋值ID //服务器时间修改、不同端口用同一个代码、多个程序插入一个表都需要用到WorkId//保证WorkId唯一 ,程序启动时配置 SnowFlakeSingle.WorkId=从配置文件读取;//GUIDdb.Insertable(data).SplitTable().ExecuteCommand();//插入GUID 自动赋值 ID//大数据写入db.Fastest<OrderSpliteTest>().SplitTable().BulkCopy(List<OrderSpliteTest>);//大数据写入方式如果用到雪花ID需要手动赋值:SnowFlakeSingle.Instance.NextId()//部分数据库需配置 具体用法看文档: https://www.donet5.com/Home/Doc?typeId=2404// sql 如下
//INSERT INTO [SplitTestTable_20190101] --如果表不存在会自动建表
// ([Id],[Name],[CreateTime])
// VALUES
// (@Id,@Name,@CreateTime)
更多信息请参考官网:.NET ORM 分表组件,自动分表 - SqlSugar 5x - .NET果糖网