Ubuntu 22.04下使用C# SqlClient连接MariaDB失败求助
连接MariaDB失败:SqlClient抛出Internal connection fatal error
环境信息
- 系统:Ubuntu 22.04
- .NET版本:7.0
- 使用库:SqlClient v4.8.5
- 目标数据库:MariaDB
我的代码
using System; using System.Data.SqlClient; var connectionString = @"Server=192.168.1.10,3306;Database=myDatabase;User Id=omnimon;Password=myPassword;"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); }
报错信息
Unhandled exception. System.InvalidOperationException: Internal connection fatal error. at System.Data.SqlClient.TdsParserStateObject.TryProcessHeader() at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean& marsCapable, Boolean& fedAuthRequired) at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at System.Data.SqlClient.SqlConnection.Open() at Program.<Main>$(String[] args) in /home/user/Projects/myProject/Program.cs:line 9
已完成的排查步骤
- 确认MariaDB监听所有端口:
user@computer-name:~$ netstat -ant | grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
- 确认防火墙已开放3306端口:
user@computer-name:~$ sudo ufw status Status: active To Action From -- ------ ---- 3306 ALLOW Anywhere 3306/tcp ALLOW Anywhere 3306 (v6) ALLOW Anywhere (v6) 3306/tcp (v6) ALLOW Anywhere (v6)
- 确认数据库用户权限:
创建用户及授权命令:
MariaDB [(none)]> CREATE USER 'omnimon'@'%' IDENTIFIED BY 'myPassword'; MariaDB [(none)]> GRANT ALL ON *.* to 'omnimon'@'%' IDENTIFIED BY 'myPassword' WITH GRANT OPTION;
- 验证连接信息有效性:使用相同的地址、端口、用户名、密码,可通过HeidiSQL成功连接MariaDB。
内容的提问来源于stack exchange,提问作者Omnimon
相关产品推荐
相关产品推荐

