如何正确连接 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 IPazure。即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# 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

正确使用与 C# 和 MySQL 的连接

如何形成正确的 MySQL 连接字符串? [关闭]

C#如何连接其他数据库,如MYSQL或者Postgresql

如何正确获取MYSQL的ADO连接字符串

如何从 C# 连接到任何数据库?

c#与mysql的连接登陆问题