【问题标题】:How to properly connect MySQL database with C# application?如何正确连接 MySQL 数据库和 C# 应用程序?
【发布时间】: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 代码,则使用可以在门户中获得的连接字符串。

标签: c# mysql azure ado.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】:

    几个可能的尝试 -

    1. 将连接字符串中的服务器名称与 Azure 门户上设置的名称相匹配。
    2. 看起来您提到的用户名和密码是虚拟的(可以理解)。检查您的实际用户名或密码是否有任何特殊字符,您必须对它们进行适当的编码才能转义。

    例如,如果您的密码是 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 之类的密码时,我遇到了这个问题

          【讨论】:

            猜你喜欢
            • 2017-05-14
            • 1970-01-01
            • 1970-01-01
            • 2018-10-23
            • 1970-01-01
            • 1970-01-01
            • 2019-06-16
            • 2019-08-06
            • 2011-07-12
            相关资源
            最近更新 更多