加sslmode=none可解决多数mysql连接失败问题,因新版本.net驱动默认强制ssl握手,而本地或旧版mysql常未配置ssl,导致报“couldn't connect to server”实为ssl协商失败。

报 Couldn't connect to server 错误,八成不是连不上服务器,而是 SSL 握手失败或连接参数不匹配。直接加 SslMode=None 能解决大部分 MySQL 场景,但不同数据库类型要分别处理。
MySQL 连接失败:SslMode=None 不是万能解,但大概率是它
新版本 .NET 驱动(MySqlConnector 2.0+ 或 MySQL Connector/NET 8.0+)默认强制尝试 SSL 连接。而本地开发环境、Docker 容器里的 MySQL、或者老版本云数据库,往往没配 SSL,导致握手失败——错误却只报“连不上服务器”。
- 最简修复:在连接字符串末尾加上
SslMode=None,例如:Server=localhost;Database=test;Uid=root;Pwd=123456;SslMode=None; - 如果仍失败,检查是否漏了端口:
Port=3306显式写上更稳妥 - 某些旧版驱动识别
UseSSL=false,但新驱动已弃用,优先用SslMode=None -
Allow User Variables=True是 MySQL 5.7+ 兼容性开关,若连的是 8.0+,可去掉,避免干扰 SSL 参数解析
SQL Server 连接报错:LocalDB 和命名实例的路径写法不能混
SQL Server 的连接字符串对实例名大小写、括号、反斜杠极其敏感,尤其在 LocalDB 或命名实例场景下。
- LocalDB 必须写全:
Server=(localdb)\MSSQLLocalDB—— 注意双反斜杠,单写在 C# 字符串里会转义成非法字符 - 命名实例不能省略实例名:
Server=myserver\SQLEXPRESS,而不是Server=myserver - Windows 认证时,
Integrated Security=true和Trusted_Connection=yes等价,但前者更通用;若用 SQL 账户,必须显式提供User Id和Password,不能混用Uid/Pwd - Azure SQL 必须启用加密:
Encrypt=true;TrustServerCertificate=false;,否则连接会被拒绝
SQLite 报 database is locked:不是并发高,是没设 busy_timeout
SQLite 是文件数据库,database is locked 错误几乎都源于写操作冲突,而非真正意义上的高并发瓶颈。
- 连接字符串中必须加
busy_timeout=3000(单位毫秒),让客户端在锁住时等待而非立刻报错 - 启用 WAL 模式能显著改善读写并发:
db.Ado.ExecuteCommand("PRAGMA journal_mode=WAL;"),但需在首次建库后执行一次,非每次连接都调 -
IsAutoCloseConnection=true可减少连接泄漏风险,但若手动管理事务,务必确保BeginTran()/CommitTran()成对出现
达梦数据库报“无效的表或视图名”:SCHEMA 必须显式指定
达梦(DM)和 Oracle 类似,对象默认归属某个 SCHEMA,DbFirst 生成类时若不指定,默认查的是当前用户 Schema,容易漏表或报错。
- 连接字符串里加
SCHEMA=PERSON,且该值必须与数据库实际 Schema 名完全一致(区分大小写) - DbFirst 时建议配合
Where过滤:db.DbFirst.Where(t => t.StartsWith("PERSON.")),避免跨 Schema 查询 - 若表名带双引号(如
"ADDRESS"),生成类时可能出问题,建议统一用不带引号的标准命名
真正难排查的从来不是语法错误,而是那些被封装层吞掉的底层协议细节——SSL 模式、Schema 上下文、SQLite 锁策略,它们不会直接出现在异常堆栈里,得靠连接字符串里一个参数一个参数地试。











