首页 > 数据库 >SqlSugar常见问题汇总

SqlSugar常见问题汇总

时间:2024-01-16 15:56:25浏览次数:37  
标签:异步 常见问题 汇总 数据库 db item 0.0 new SqlSugar

1、已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。

There is already an open DataReader associated with this Connection which must be closed first.

或者出现 connection is closed

出现这个错一般是线程安全引起的

解决方案: https://www.donet5.com/Home/Doc?typeId=1224

 

2.The connection does not support MultipleActiveResultSets

 (1)、SqlSugarClient 替换成 SqlSugarScope ,因为SqlSugarScope 是线程安全对象代码容错率高

   具体用法: https://www.donet5.com/Home/Doc?typeId=1181

   (2)  、异步用法错引起的 ,排查没用Await调用的异步方法

Public void  GetAll(){  异步方法  }//错误 Public async Task GetAll(){  异步方法  }//错误 Public async Task GetAll(){  await  异步方法  }//正确

 

 3. max_allowed_packet  MYSQL

一般提示这个错可能一次更新的内容太多,可以分页操作

db.Utilities.PageEach(allList, 10000 ,pageList=> {   db.Insertable(pageList).ExecuteCommand(); });

 

4、实体与表映射出错

出现这个错一般是 数据库中的类型和实体中的类型不一样引起的,可以注释实体类中的字段进行排除哪个字段引起的

 

5、Only one primary key

当前功能只支持单主键,看看实体类有没有与置主键,并且主键只能有一个,或者数据库是否有主键并且只能有一个

 

6、未安装或者版本冲突

打开 Web层或者WinFom的项目,查看 App.config 有没有下面这种兼容配置,如果没这种配置这个DLL就会报错,

想办法搞出来,一般NUGET在当前项目安装 SqlSugar然后在安装报错的DLL NUGET会自动添加到app.config

例1:

          <dependentAssembly>         <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />         <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />       </dependentAssembly>

例2:

  <dependentAssembly>         <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />         <bindingRedirect oldVersion="0.0.0.0-8.0.27.0" newVersion="8.0.27.0" />    </dependentAssembly>

如果没有先安装SqlSugar,在安装报错dll

 

7、雪花ID重复

 不同电脑 本地或者服务器 要用不同的WorkId ,如果服务器时间回调也要设置WorkId

 

8、Cannot Open when State is Connecting.

解决方案: https://www.donet5.com/Home/Doc?typeId=1224

 

9、连接不上数据库

原生能用SqlSugar就能用,一定要用db.CurrentConfig.ConnectionString保证是同一个字段串,并且在同一个程序

//用原代码进行测试 //SqlSerer  var conn=new SqlConnection(db.CurrentConfig.ConnectionString).Open(); conn.Close();   //MySql用 var conn=new MySqlConnection(db.CurrentConfig.ConnectionString).Open(); conn.Close();   //不同的数据库不同 ,一般根据DbType+Connection

 

10、截断二进制

Data too long for column

数据库字段太小引起的

 

11、特殊表字段名带有.或者()这字符兼容

因为考虑性能,比如数据库里面字段名字叫: 金额(元) ,生在SQL如下 where [金额(元)]=@金额(元) ,字段能转译参数名做不到所有都过滤,

 这样参名字会报错,所以ORM提供了AOP来处理这个问题

  db.Aop.OnExecutingChangeSql = (s, p) =>             {                 foreach (var item in p)                 {                     if (item.ParameterName.Contains("("))                     {                         var oldName = item.ParameterName;                         //重点看这儿,把参数名变成正常的名字                         item.ParameterName = item.ParameterName                                     .Replace("(""_")                                     .Replace(")""_")                                     .Replace(".""_");                         s = s.Replace(oldName, item.ParameterName);                     };                 }                 return new KeyValuePair<string, SugarParameter[]>(s, p);             };

 

12、与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

(1) 出现这个错一般是超过数据库处理上限,可以用异步提升性能,max pool size字符串设置大些

(2) 并发不高情况一般是线程安全引起的, 看文档:偶发错误

 

13、The connection was not closed. The connection's current state is connecting

看文档:偶发错误

 

14、参数名有空格特殊符号

对性能会有影响,能局部修改配置就局部,尽量不要全局使用

//全局生效 SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() {     ConnectionString = $"Data Source={dbFileName};",     DbType = DbType.Sqlite,     IsAutoCloseConnection = true,     MoreSettings = new ConnMoreSettings     {         IsCorrectErrorSqlParameterName= true// 5.1.4.111及以上版本     } });   //局部生效 db.CurrentConnectionConfig.MoreSettings=new MoreSettings(){  IsCorrectErrorSqlParameterName= true}

 

15、Connect Timeout expired. All pooled connections are in use

并发不高出现这个错一般是线程安全问题

标签:异步,常见问题,汇总,数据库,db,item,0.0,new,SqlSugar
From: https://www.cnblogs.com/yswenli/p/17967856

相关文章

  • SqlSugar的Repository
    1、仓储说明仓储可以让你的方法更加的规范,需要什么方法都封装到仓储中,下次就能重复使用,并且能很好的和你业务拆分开 这种设计模式简单粗暴用起来也方便,文章下面有可以运行的DEMO 2、仓储方法仓储有一套自带的数据库操作方法,比起db.xx.xxx来说可能更简便些满足一些常用需......
  • SqlSugar的查询函数SqlFunc
    用法我们可以使用SqlFunc这个类调用Sql函数,用法如下:db.Queryable<Student>().Where(it => SqlFunc.ToLower(it.Name) == SqlFunc.ToLower("JACK")).ToList(); C#函数支持一些常用的C#函数.ToString .Contains .Length.ToLower .ToUpper .ToSubstrin......
  • SqlSugar的Where用法
    1、普通表达式查询//id=@idvar list=db.Queryable<Student>().Where(it => it.Id == id).ToList(); //多个条件var list2=db.Queryable<Student>().WhereIF(id>0,it => it.Id == id)// 如果id>0 添加条件 id=@id  .WhereIF(name!=null,it => it.nam......
  • SqlSugar的Select用法
    Select位置正常情况:应该在最后面,一般是.Where(..).OrderBy(..).Select(..).ToList()特殊情况:如果Select不是最后一个位置,则Select要加MergeTable()合并成一个表,Select(...).MergeTable().Where语法糖:Select(...).MergeTable()在新版本中可以用SelectMergeTable(it=>newx......
  • SqlSugar跨库查询/多库查询
    一、跨库方式1:跨库导航(5.1.3.24)优点1:支持跨服务器,支持跨数据库品种,支持任何类型数据库 优点2:  超级强大的性能,能达到本库联表性能缺点:不支持子表过滤主表(方案有ToList后在内存过滤,如果分页可以查前1000条主表在内存分页前端只显示前10页)[Tenant("db2")] //......
  • SqlSugar新增数据
    1、插入方式1.1单条插入实体//返回插入行数db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现//异步: await db.Insertable(insertObj).ExecuteCommandAsync() //插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)db.Insertable(in......
  • SqlSugar更新数据
    1、根据实体对象更新所谓按实体对象更新就是:db.Updateable(参数对象)有参数的重载db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单优点1、代码少2、支持各种批量修改缺点1、不支持表达式和sql函数2、依赖 实体对象,没实体对象就需......
  • SqlSugar删除数据
    1、根据实体删除1.1强类型实体 需要配置主键,根据主键删除需要给实体配置主键,参考文档实体配置//单个实体db.Deleteable<Student>(new Student() { Id = 1 }).ExecuteCommand(); //List<实体> (可以不加Where)List<Student> list=new List<Student>(){......
  • SqlSugar基础查询
    查所有List<Student> list=db.Queryable<Student>().ToList()//select * from Student查询总数int count=db.Queryable<Student>().Count()//select count(1) from Student按条件查询db.Queryable<Student>().Where(it=>it.Id......
  • SqlSugar分组查询
    一、分组查询和使用1.1语法只有在聚合对象需要筛选的时候才会用到Having,一般分组查询用不到可以去掉  var list = db.Queryable<Student>()             .GroupBy(it => new { it.Id, it.Name }) //可以多字段             .Whe......