如何正确连接 MySQL 数据库和 C# 应用程序?
Posted
技术标签:
【中文标题】如何正确连接 MySQL 数据库和 C# 应用程序?【英文标题】:How to properly connect MySQL database with C# application? 【发布时间】:2020-09-17 17:29:55 【问题描述】:我正在尝试将我的mysql
数据库与C#
连接,但它没有连接。
我正在使用
static string connstring = @"server=my.live.ip;userid=user;password=123;database=db_name;port=3306";
但我还是得到了
使用方法 'mysql_native_password' 对用户 'user' 的主机 'my.live.ip' 进行身份验证失败并显示消息:用户 'user'@'202.xxx.xxx.xxx' 的访问被拒绝(使用密码:否) `
我已经对其进行了搜索,但没有找到任何合适的解决方案。
P.S: 我使用的live IP
是azure
。即MySQL
数据库通过xampp
托管在 azure 服务器上
任何帮助将不胜感激
【问题讨论】:
MySQL服务器上的用户user
是否允许从主机202.xxx.xxx.xxx
连接?
允许与任意主机连接
它与我的 php 应用程序完美配合
您是否可以使用同一用户从任何其他主机进行连接?
xampp 跟它有什么关系?如果您正在编写 .NET 代码,则使用可以在门户中获得的连接字符串。
【参考方案1】:
(using password: NO)
表示未提供密码。我不熟悉 C# 的连接语法,但我怀疑
static string connstring =
@"server=my.live.ip;userid=user;password=123;database=db_name;port=3306";
或者connstring
没有被使用。
还要检查 MySQL 端。使用SHOW GRANTS FOR 'user'@'202%'
或SHOW GRANTS FOR 'user'@'202.xxx.xxx.xxx'
,具体取决于您是否使用'202%'
或'202.xxx.xxx.xxx'
作为“主机”。
你应该得到类似的东西
GRANT ... ON dbname.* TO 'user'@'202%' WITH AUTHENTICATION 'mysql_native_password';
注意:主机名与 IP 地址可能是个问题。
【讨论】:
【参考方案2】:几个可能的尝试 -
-
将连接字符串中的服务器名称与 Azure 门户上设置的名称相匹配。
看起来您提到的用户名和密码是虚拟的(可以理解)。检查您的实际用户名或密码是否有任何特殊字符,您必须对它们进行适当的编码才能转义。
例如,如果您的密码是 my>Pass,则连接字符串应如下所示。
static string connstring = @"server=servername;userid=user;password=my>Pass;database=db_name;port=3306";
如果您想探索,这里是full list。
【讨论】:
【参考方案3】:using System;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
namespace AzureMySqlExample
class MySqlCreate
static async Task Main(string[] args)
var builder = new MySqlConnectionStringBuilder
Server = "YOUR-SERVER.mysql.database.azure.com",
Database = "YOUR-DATABASE",
UserID = "USER@YOUR-SERVER",
Password = "PASSWORD",
SslMode = MySqlSslMode.Required,
;
using (var conn = new MySqlConnection(builder.ConnectionString))
Console.WriteLine("Opening connection");
await conn.OpenAsync();
using (var command = conn.CreateCommand())
command.CommandText = "DROP TABLE IF EXISTS inventory;";
await command.ExecuteNonQueryAsync();
Console.WriteLine("Finished dropping table (if existed)");
command.CommandText = "CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);";
await command.ExecuteNonQueryAsync();
Console.WriteLine("Finished creating table");
command.CommandText = @"INSERT INTO inventory (name, quantity) VALUES (@name1, @quantity1),
(@name2, @quantity2), (@name3, @quantity3);";
command.Parameters.AddWithValue("@name1", "banana");
command.Parameters.AddWithValue("@quantity1", 150);
command.Parameters.AddWithValue("@name2", "orange");
command.Parameters.AddWithValue("@quantity2", 154);
command.Parameters.AddWithValue("@name3", "apple");
command.Parameters.AddWithValue("@quantity3", 100);
int rowCount = await command.ExecuteNonQueryAsync();
Console.WriteLine(String.Format("Number of rows inserted=0", rowCount));
// connection will be closed by the 'using' block
Console.WriteLine("Closing connection");
Console.WriteLine("Press RETURN to exit");
Console.ReadLine();
【讨论】:
习惯上解释为什么你的答案解决了问题,而不是仅仅转储代码。【参考方案4】:你可以查一下,但我找到了以下代码:
用你需要的替换所有端口#用户名和密码数据库名称和服务器IP。
代码:
using System;
using System.Windows;
using MySql.Data.MySqlClient;
namespace Deportes_WPF
public partial class Login : Window
private MySqlConnection connection;
private string server;
private string database;
private string user;
private string password;
private string port;
private string connectionString;
private string sslM;
public Login()
InitializeComponent();
server = "server_name";
database = "database_name";
user = "user_id";
password = "password";
port = "3306";
sslM = "none";
connectionString = String.Format("server=0;port=1;user id=2; password=3; database=4; SslMode=5", server, port, user, password, database, sslM);
connection = new MySqlConnection(connectionString);
private void conexion()
try
connection.Open();
MessageBox.Show("successful connection");
connection.Close();
catch (MySqlException ex)
MessageBox.Show(ex.Message + connectionString);
private void btn1_Click(object sender, RoutedEventArgs e)
conexion();
我希望这段代码对你有用。
看起来你给我的错误是用户名或密码无效。
【讨论】:
对于 MySQL azure,只需将服务器名称/IP 地址所在的 azure URL 放入。 仍然遇到同样的问题 :( 好的,我会继续找东西的。 用户名或密码好像不正确。你检查过吗?【参考方案5】:试试这个:
const string connStr = "Server=my.live.ip; User=user; Database=db_name; Password=123; port=3306;
Allow Zero Datetime=true; Convert Zero Datetime=true;";
希望这会有所帮助。
【讨论】:
【参考方案6】:using System;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
namespace AzureMySqlExample
class MySqlCreate
static async Task Main(string[] args)
var builder = new MySqlConnectionStringBuilder
Server = "YOUR-SERVER.mysql.database.azure.com",
Database = "YOUR-DATABASE",
UserID = "USER@YOUR-SERVER",
Password = "PASSWORD",
SslMode = MySqlSslMode.Required,
;
using (var conn = new MySqlConnection(builder.ConnectionString))
Console.WriteLine("Opening connection");
await conn.OpenAsync();
using (var command = conn.CreateCommand())
command.CommandText = "DROP TABLE IF EXISTS inventory;";
await command.ExecuteNonQueryAsync();
Console.WriteLine("Finished dropping table (if existed)");
command.CommandText = "CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);";
await command.ExecuteNonQueryAsync();
Console.WriteLine("Finished creating table");
command.CommandText = @"INSERT INTO inventory (name, quantity) VALUES (@name1, @quantity1),
(@name2, @quantity2), (@name3, @quantity3);";
command.Parameters.AddWithValue("@name1", "banana");
command.Parameters.AddWithValue("@quantity1", 150);
command.Parameters.AddWithValue("@name2", "orange");
command.Parameters.AddWithValue("@quantity2", 154);
command.Parameters.AddWithValue("@name3", "apple");
command.Parameters.AddWithValue("@quantity3", 100);
int rowCount = await command.ExecuteNonQueryAsync();
Console.WriteLine(String.Format("Number of rows inserted=0", rowCount));
// connection will be closed by the 'using' block
Console.WriteLine("Closing connection");
Console.WriteLine("Press RETURN to exit");
Console.ReadLine();
您可以参考下面的链接使用c#创建和访问mysql db https://docs.microsoft.com/en-us/azure/mysql/connect-csharp
【讨论】:
【参考方案7】:您的密码是否以#
或类似字符开头,并且您将其存储在某个配置文件中,例如ini
由于某些配置类型将某些特殊字符视为 cmets 或其他字符,因此密码变为 null
。
要验证,请将您的密码更改为字母数字一次并进行测试。当我使用 password=#strongP
之类的密码时,我遇到了这个问题
【讨论】:
以上是关于如何正确连接 MySQL 数据库和 C# 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章