C# Can';t使用MySQLConnection连接到MySQL数据库

C# Can';t使用MySQLConnection连接到MySQL数据库,c#,mysql,C#,Mysql,我正在使用MySqlConnection类连接到本地MySQL数据库: SourceHost = ConfigurationManager.AppSettings["sourceHost"]; SourceDatabase = ConfigurationManager.AppSettings["sourceDatabase"]; SourceUsername = ConfigurationManager.AppSettings["sourceUsername"]; SourcePassword

我正在使用MySqlConnection类连接到本地MySQL数据库:

SourceHost = ConfigurationManager.AppSettings["sourceHost"];
SourceDatabase = ConfigurationManager.AppSettings["sourceDatabase"];
SourceUsername = ConfigurationManager.AppSettings["sourceUsername"];
SourcePassword = ConfigurationManager.AppSettings["sourcePassword"];

SourceString = String.Format("Server={0};Database={1};UID={2};Password={3};", SourceHost, SourceDatabase, SourceUsername, SourcePassword);
var sqlSourceConnection = new MySqlConnection(SourceString);

sqlSourceConnection.Open();
这些是App.config文件中的值

<add key="sourceHost" value="myHost" />
<add key="sourceDatabase" value="myDB" />
<add key="sourceUsername" value="myUSer" />
<add key="sourcePassword" value="myPSW" />
<add key="sourceDbType" value="mysql" />

我得到的错误是:用户的访问被拒绝myUser@myHost.myDomain使用密码:是的,但是通过使用myUser和myPSW凭据,我可以从命令提示符登录

怎么了

编辑:当我将sourceHost更改为

<add key="sourceHost" value="localhost" />

用户myUser仅从本地主机获得授权
您需要为您的主机名授权myUser

GRANT ALL PRIVILEGES ON *.* to 'myUser'@'%' WITH GRANT OPTION;

或者你也可以这样做

GRANT ON *.* TO 'myUser'@'%.myDomain' IDENTIFIED BY 'password' ;

标准

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
指定TCP端口

Server=myServerAddress;Port=1234;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
端口3306是默认的MySql端口。如果使用Unix套接字,该值将被忽略。

当您尝试时,您应该看到这样一行:

mysql> SHOW GRANTS;
+-----------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'myUSer'@'localhost' WITH GRANT OPTION |
+-----------------------------------------------------------------------+
请注意
localhost
,因此连接会发生这种情况:

  • 当您尝试连接到
    localhost
    时,系统会自动使用
    127.0.0.1
    作为连接源地址
  • 但当您连接到
    10.0.0.1
    时,它将
    10.0.0.1
    用作源地址
试试看:

C:\>pinglocalhost-s127.0.0.1
使用32字节的数据从127.0.0.1 ping localhost[127.0.0.1]:
来自127.0.0.1的回复:bytes=32 timeping localhost-s10.0.0.1
使用32字节的数据从10.0.0.1 ping localhost[127.0.0.1]:
PING:传输失败。普遍失败。
C:\>ping 10.0.0.1-S 10.0.0.1
使用32字节数据从10.0.0.1 ping 10.0.0.1:
来自10.0.0.1的回复:字节数=32次计时10.0.0.1-S 127.0.0.1
使用32字节数据从127.0.0.1 ping 10.0.0.1:
PING:传输失败。普遍失败。
因此它适用于
localhost
,因为
localhost
是允许的源主机,而它不适用于
您的\u主机
,因为
10.0.0.1
不是允许的主机


只需将您的用户权限授予
10.0.0.1
,它就会工作(可能您必须更改防火墙设置),或者允许从外部进行所有连接(使用
%
作为主机)。

您是否在命令行上尝试的同一主机上运行代码?请检查端口。MySQL通常将端口定义为3306,但是如果您更改了端口,或者正在使用另一个发行版(例如,MariaDB),则凭据将崩溃。其他解决方案:检查您的用户是否有权读取您的数据库。@mable是的,我正在从命令行运行它。我检查了数据库,它正在使用端口3306。我尝试登录的用户是root。当我用localhost替换机器名时,它开始工作。我认为它试图使用某种形式的域身份验证,而不是SQL登录。
mysql> SHOW GRANTS;
+-----------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'myUSer'@'localhost' WITH GRANT OPTION |
+-----------------------------------------------------------------------+