SqlSugar入门

  • SqlSugar入门已关闭评论
  • 59 次浏览
  • A+
所属分类:.NET技术

SqlSugar入门

创建对象

你可以使用 SqlSugarClient (new模式)或者 SqlSugarScope (单例) 对数据库进行增、删、查、改等功能
注意:除了名字和使用模式不同,功能和API都一模一样
SqlSugarClient(new模式)
优点:性能比SqlSugarScope有5%左右提升
缺点: db不能跨上下文使用,需要new出一个新对象(EF和Dapper一样),
偶发错误难排查适合有经验用户
 模式:不能单例,因为他不是线程安全对象
SqlSugarScope (单例模式)
5.0.3.4
特色功能
 
如果没有.NET 开发经验的推荐使用 SqlSugarScope能够解决大部分线程安全问题。
 原理是用的AsyncLocal异步上下文的不同来实现的线程安全。
 
注意:同一个异步上下文进行并发操作AsyncLocal也不能保证线程安, 下面3种情况
 1.第三方Job  (必须将db改成db.CopyNew())
 2.Task.WhenAll  、ForAsync 、ParallelAsync (必须将db改成db.CopyNew())
 3. 异步漏写await 或者 方法不是Task类型或者Func(Void(方法) Action(表达式)
(推荐修改错误代码 , 如果就是不想修改也是可以db.CopyNew()解决)
 
 模式: 单例模式   SqlSugarScope一直new会内存泄露 一定要用单例
 
 

1、Scope模式:SqlSugarClient  

注意非单例模式用的是SqlSugarClient , 禁止用SqlSugarScope

1.1 完整用例

SqlSugarClient 每次请求new一个新对象,db禁止跨上下文使用,IOC建议用Scope或者瞬发注入
    //查询所有     public static void Demo()     {           //创建数据库对象 (用法和EF Dappper一样通过new保证线程安全)      SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){            ConnectionString = "连接符字串",             DbType = DbType.SqlServer,            IsAutoCloseConnection = true},            db=>{                  //5.1.3.24统一了语法和SqlSugarScope一样,老版本AOP可以写外面                                     db.Aop.OnLogExecuting = (sql, pars) =>                   {                     Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响                                                               //获取原生SQL推荐 5.1.4.63  性能OK                      Console.WriteLine(UtilMethods.GetNativeSql(sql,pars))                                                     //获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用                     //UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)                                                               };                                        //注意多租户 有几个设置几个                    //db.GetConnection(i).Aop                        });            //建表      //db.CodeFirst.InitTables<Student>(); 更多看文档迁移                          //查询表的所有      var list = db.Queryable<Student>().ToList();            //插入      db.Insertable(new Student() { SchoolId = 1, Name = "jack" }).ExecuteCommand();            //更新      db.Updateable(new Student() { Id = 1, SchoolId = 2, Name = "jack2" }).ExecuteCommand();            //删除      db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();       }               //实体与数据库结构一样     public class Student     {      //数据是自增需要加上IsIdentity       //数据库是主键需要加上IsPrimaryKey       //注意:要完全和数据库一致2个属性      [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]      public int Id { get; set; }      public int? SchoolId { get; set; }      public string Name { get; set; }      }

1.2 偶发错误

 SqlSugarClient 出现偶发错误全部换成SqlSugarScope进行测试,如果换了不报错了那么证明就是
线程安全问题,你也可以直接使用SqlSugarScope因为他是线程安全的 ,用SqlSugarScope要改成单例不然会有内存增加风险
 

1.3  AddScope IOC

Scope我们需要用SqlSugarClient
//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行 services.AddHttpContextAccessor(); //注册SqlSugar用AddScoped services.AddScoped<ISqlSugarClient>(s => {         //Scoped用SqlSugarClient      SqlSugarClient sqlSugar = new SqlSugarClient (new ConnectionConfig()     {         DbType = SqlSugar.DbType.Sqlite,         ConnectionString = "DataSource=sqlsugar-dev.db",         IsAutoCloseConnection = true,     },    db =>    {       //每次上下文都会执行                   //获取IOC对象不要求在一个上下文       //vra log=s.GetService<Log>()                       //获取IOC对象要求在一个上下文       //var appServive = s.GetService<IHttpContextAccessor>();       //var log= appServive?.HttpContext?.RequestServices.GetService<Log>();                         db.Aop.OnLogExecuting = (sql, pars) =>        {                };    });     return sqlSugar; });   //用接口接收 public class(ISqlSugarClient  db)

 

2、单例模式:SqlSugarScope 

2.1 完整用例

SqlSugarScope 请使用单例模式,配置参数有2种周期
(A):全局生效
(B):   当前上下文生效
 public  class  SqlSugarHelper //不能是泛型类  {       //多库情况下使用说明:     //如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档:多租户     //如果是不固定多库 可以看文档Saas分库                //用单例模式     public static SqlSugarScope Db= new SqlSugarScope(new ConnectionConfig()    {             ConnectionString = "Server=.xxxxx",//连接符字串             DbType = DbType.SqlServer,//数据库类型             IsAutoCloseConnection = true //不设成true要手动close    },   db=> {          //(A)全局生效配置点,一般AOP和程序启动的配置扔这里面 ,所有上下文生效          //调试SQL事件,可以删掉          db.Aop.OnLogExecuting = (sql, pars) =>          {           Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响                       //获取原生SQL推荐 5.1.4.63  性能OK            //UtilMethods.GetNativeSql(sql,pars)                                            //获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用            //UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)                               };                    //多个配置就写下面          //db.Ado.IsDisableMasterSlaveSeparation=true;                     //注意多租户 有几个设置几个           //db.GetConnection(i).Aop      });    }    //(B)当前上下文生效配置点,一般多租户相关操作写在这儿     //db.GetConnectionxxx 只在当前上下文有效,不会共享    //如果是程序启动时的配置全部到A里面去       //建表   //db.CodeFirst.InitTables<Student>(); 更多看文档迁移         //查询表的所有   var list=SqlSugarHelper.Db.Queryable<Student>().ToList();         //插入   SqlSugarHelper.Db.Insertable(new Student(){ SchoolId = 1, Name = "jack" }).ExecuteCommand();         //更新   SqlSugarHelper.Db.Updateable(new Student(){ Id = 1,SchoolId=2,Name="jack2" }).ExecuteCommand();         //删除   SqlSugarHelper.Db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();          //实体与数据库结构一样    public class Student    {      //数据是自增需要加上IsIdentity       //数据库是主键需要加上IsPrimaryKey       //注意:要完全和数据库一致2个属性      [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]      public int Id { get; set; }      public int? SchoolId { get; set; }      public string Name { get; set; }    }

验证单例是否成功:
SqlSugarHelper.Db.HasCode();//只要看这个hascode在服务启动后都一个那么说明成功了 //IOC直接复制我的DEMO就不需要验证

2.2 偶发错误 

2.3 原理

2.4  AddSingleton IOC

//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行 services.AddHttpContextAccessor(); //注册SqlSugar services.AddSingleton<ISqlSugarClient>(s => {     SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()     {         DbType = SqlSugar.DbType.Sqlite,         ConnectionString = "DataSource=sqlsugar-dev.db",         IsAutoCloseConnection = true,     },    db =>    {                //每次上下文都会执行                   //获取IOC对象不要求在一个上下文       //vra log=s.GetService<Log>()                       //获取IOC对象要求在一个上下文       //var appServive = s.GetService<IHttpContextAccessor>();       //var log= appServive?.HttpContext?.RequestServices.GetService<Log>();                         db.Aop.OnLogExecuting = (sql, pars) =>        {                };    });     return sqlSugar; });  //用接口接收 public class(ISqlSugarClient  db)

 

多库用法 

var db = new SqlSugarClient(new List<ConnectionConfig>() {  new ConnectionConfig(){ConfigId="0",DbType=DbType.SqlServer,ConnectionString=..,IsAutoCloseConnection=true},  new ConnectionConfig(){ConfigId="1",DbType=DbType.MySql,ConnectionString=..,IsAutoCloseConnection=true  } }); var childA=db.GetConnection("A"); var childB=db.GetConnection("B");

 
连接参数
SqlSugarClient是通过ConnectionConfig进行传参数详细参数如下
名称
描述
必填
DbType
数据库类型
ConnectionString
连接字符串
IsAutoCloseConnection
自动释放和关闭数据库连接,如果有事务事务结束时关闭,否则每次操作后关闭
 
ConfigureExternalServices
一些扩展层务的集成
 
MoreSettings
  • 点击查看
 
SlaveConnectionConfigs
主从设置
 
LanguageType
提示错误可以设置语言
 
 
设置超时
设置超时时间
//Sql超时 db.Ado.CommandTimeOut = 30;//单位秒  //db.Open 连接超时 //在连接池符串加上 Connection Timeout=10  ,默认是30秒,单位秒

 
 
验证连接是否成功(数据库连接成功)
版本要求:5.0.6.5 preview05 +
db.Ado.IsValidConnection()  //如果时间长,可以在连接字符串配置 连接超时时间  //上面写法如果写到事务中会影响事务 //事务中我会可以new一个新对象处理  db.CopyNew().Ado.IsValidConnection()  // 数据库连接成功

 

打印SQL 

单库sql打印

 
    SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){            ConnectionString = "连接符字串",             DbType = DbType.SqlServer,            IsAutoCloseConnection = true},            db=>{                  //5.1.3.24统一了语法和SqlSugarScope一样,老版本AOP可以写外面                  db.Aop.OnLogExecuting = (sql, pars) =>                  {                      Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响                                                  //获取原生SQL推荐 5.1.4.63  性能OK                      Console.WriteLine(UtilMethods.GetNativeSql(sql,pars))                                                      //获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用                      Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))                  }                  //注意多租户 有几个设置几个                  //db.GetConnection(i).Aop       });    //老版本    //版本太老没有db=>{}委托写在下面一行就行了

多库设置SQL

打印和上面有区别,需要一个一个设置
//注意:  //如果你用的 GetConnectionScope或者 GetConnectionScopeWithAttr AOP也应该用 GetConnectionScope  //如果你用的 GetConnection或者 GetConnectionWithAttr AOP也应该用 GetConnectionScope      SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){            ConnectionString = "连接符字串",             DbType = DbType.SqlServer,            IsAutoCloseConnection = true},            db=>{                       //也可以这里面循环                    db.GetConnection("1").Aop.OnLogExecuting = (sql, pars) =>                    {                      Console.WriteLine("执行1库"+sql);                    };                    db.GetConnection("0").Aop.OnLogExecuting = (sql, pars) =>                    {                       Console.WriteLine("执行0库"+sql);                    };     });

 

国际化

错误提示可以设置相应的语言

1.枚举说明

    public enum LanguageType     {         Default=0, //中&英         Chinese=1, //处理过的异常尽量中文,未处理的还是英文         English=2 //全部英文     }

2.用例 

  SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()   {                 ConnectionString = Config.ConnectionString,                 DbType = DbType.SqlServer,                 LanguageType=LanguageType.English,//只显示英文                 IsAutoCloseConnection = true     });

 

长连接用法(3种方式)

1.事务中是长连接

2.手动释放模式是长连接(不推荐需要手动释放)

3.自动释放中 不使用事务我们可以用OpenAlways实现长连接

 //5.0.6.3  using (db.Ado.OpenAlways()) {           db.Queryable...      db.Insertable...      //比如当前会话生效的临时表就需要长连接,不然创建了访问不了               }

 

配置最小时间

新功能:5.0.8.1
推荐用默认的,这样多种数据库使用不报错,当然你也可以强制设置
 db.CurrentConnectionConfig.MoreSettings = new ConnMoreSettings  {         DbMinDate = DateTime.MinValue//默认最小时间是 1900-01-01 00:00:00.000   };