SqlSugar 连接MySql 8.0.29报错

Posted v空空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlSugar 连接MySql 8.0.29报错相关的知识,希望对你有一定的参考价值。

一、背景

从公司服务器mysql(版本:8.0.16)导出数据库表结构和数据,再我本地电脑Mysql(版本:8.0.29) 还原,打算开启爆肝模式。结果刚启动项目就提示SqlSugar数据库连接报错。提示错误如下:

执行 Db.Ado.CheckConnection() 报错
English Message : Connection open error . The given key ‘0’ was not present in the dictionary.
Chinese Message : 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,实在找不到原因请先Google错误信息:The given key ‘0’ was not present in the dictionary…


注:连接字符串:database=stocks;server=127.0.0.1;port=3306;uid=root;pwd=123;

同样的源代码,连接公司服务器Mysql运行无问题,连接本地Mysql运行就提示报错,简直神奇。经各种分析,主要问题是连接字符串中需添加字符编码。。。详见解决方案

接下来是个别表查询报错问题

个别表执行查询 this.DB.Queryable().Where(p=>true).ToList() 报错。主要是ToList()报错,经分析,主要问题是当前表字段字符集 和 排序规则不统一。报错如下:
MySql.Data.MySqlClient.MySqlException:“Fatal error encountered attempting to read the resultset.”
内部异常MySqlException: Expected end of data packet

执行MySQL批量修改数据表和数据表中所有字段的字符集,即可解决此问题。详见解决方案

二、解决方案

1.解决连接报错方式

添加 charset=utf8mb4 ,连接不再报错。注意:要utf8mb4,我在本地用utf8,仍然报错。

database=stocks;server=127.0.0.1;port=3306;uid=root;pwd=123;charset=utf8mb4;

2.修改数据库字符集不统一问题

按需执行下面Sql 脚本就行。

(1)更改某表编码(字符集)和表中所有字段的编码(字符集):

ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
·TABLE_NAME 替换成你所需表名·

(2)更改所有的表编码(字符集)和表中所有字段的编码(字符集):

SELECT
	CONCAT(
		'ALTER TABLE ',
		TABLE_NAME,
		' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'
	)
FROM
	information_schema.`TABLES`
WHERE
	TABLE_SCHEMA = 'DATABASE_NAME';
·DATABASE_NAME 替换成你所需数据库名·

三、其他内容

查询某个数据库所有表名的语句:

SHOW FULL COLUMNS FROM TABLE_NAME;
·TABLE_NAME 替换成你所需表名·

引用:
[1] MySQL批量修改数据表和数据表中所有字段的字符集

SqlSugar ORM已经支持读写分离

目前只有MYSQL版 3.5.2.9 支持,其库版本12月3号更新该功能

 

用例讲解 

using (var db = new SqlSugarClient("主连接字符串", "从连接字符串","可以多个从连接"))
{
  var list= db.Queryable<Student>().ToList();//走从
  var list= db.Queryable<Student>().ToJson();//走从
  db.Insert(new Student() { name="写入" });//走主
  db.Delete(new Student() {id=1 });//走主
  db.BeginTran //事务内操作都是主
   
   
}

 

说明

/// <summary>

/// 初始化 SqlSugarClient 类的新实例(主从模式)
/// </summary>
/// <param name="masterConnectionString">主:写入事务等操作</param>
/// <param name="slaveConnectionString">从:无事务读取</param>
public SqlSugarClient(string masterConnectionString,params string [] slaveConnectionString)
    : base(masterConnectionString, slaveConnectionString)
{
    ConnectionString = masterConnectionString;
}

 

注意:

 

ORM是完美支持了主从分离,但是您还需要设置您的数据库开启主从同步才可以,例如SqlServer有alwayson等技术。

 

如果您还不了解SqlSugar ORM请查看 http://www.codeisbug.com/Home/Doc?typeId=7

 

以上是关于SqlSugar 连接MySql 8.0.29报错的主要内容,如果未能解决你的问题,请参考以下文章

使用SqlSugar连接多个数据库(sqlserver,sqlite,mysql)

sqlsugar发布时间

SqlSugar ORM已经支持读写分离

SqlSugar ORM已经支持读写分离

sqlsugar可以参数化查询吗

T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll