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果糖網