VB.Net应用无法连接MariaDB数据库(同凭据Python可用)
解决思路
1. 检查数据库用户的主机授权范围
MariaDB的用户权限与访问主机绑定,即便用户名密码正确,若Windows 11的IP不在该用户的授权列表内,就会触发Access denied:
- 登录群晖MariaDB(通过phpMyAdmin或SSH命令行),执行SQL查看用户授权主机:
SELECT user, host FROM mysql.user WHERE user = '<你的用户名>'; - 若结果中
host仅为树莓派IP而非%(允许所有主机)或Windows 11的IP,需添加对应授权:
或直接授权局域网所有主机(适合内网环境):-- 授权Win11单独IP访问data库 GRANT ALL PRIVILEGES ON data.* TO '<你的用户名>'@'Win11_IP地址' IDENTIFIED BY '<你的密码>'; FLUSH PRIVILEGES;GRANT ALL PRIVILEGES ON data.* TO '<你的用户名>'@'%' IDENTIFIED BY '<你的密码>'; FLUSH PRIVILEGES;
2. 替换为MariaDB官方.NET连接器
你当前使用的MySql.Data.MySqlClient是Oracle维护的MySQL驱动,与MariaDB存在兼容性风险,建议改用官方驱动:
- 在NuGet包管理器中安装
MariaDBConnector - 修改代码命名空间:将
Imports MySql.Data.MySqlClient替换为Imports MariaDBConnector - 连接字符串写法保持不变,兼容性会显著提升
3. 用连接字符串构建器避免拼接错误
若用户名/密码包含特殊字符(如&、=、@),直接拼接字符串会导致解析失败,进而触发权限类错误。改用构建器生成连接字符串:
Dim connBuilder As New MySqlConnectionStringBuilder() connBuilder.Server = server connBuilder.UserID = username connBuilder.Password = password connBuilder.Database = database connBuilder.Port = 3306 ' 与Python代码保持一致,显式指定端口 sqlConn.ConnectionString = connBuilder.ConnectionString
4. 显式指定端口并检查防火墙
- 你的Python代码明确指定了
port=3306,VB代码建议显式添加该参数,避免端口配置不一致 - 检查Windows 11防火墙是否允许VB应用出站访问3306端口
- 检查群晖NAS防火墙规则,确认未阻止Windows 11的IP访问3306端口
5. 排查SSL配置问题
部分MariaDB版本默认要求SSL连接,Python连接器会自动适配,而MySql.Data默认关闭SSL。可在连接字符串中添加SSL参数测试:
sqlConn.ConnectionString = "server=" + server + ";user id=" + username + ";password=" + password + ";database=" + database + ";port=3306;SslMode=Preferred"
若仍失败,可临时关闭SSL排查问题(仅用于测试,不建议长期关闭):
sqlConn.ConnectionString = "server=" + server + ";user id=" + username + ";password=" + password + ";database=" + database + ";port=3306;SslMode=None"
内容的提问来源于stack exchange,提问作者user1921922
相关产品推荐
相关产品推荐

