Как правильно подключить базу данных MySQL к приложению C#? - PullRequest
6 голосов
/ 30 мая 2020

Я пытаюсь подключить свою MySQL базу данных к C#, но она не подключается.

Я использую

static string connstring = @"server=my.live.ip;userid=user;password=123;database=db_name;port=3306";

, но все равно получаю

Аутентификация на хосте my.live.ip для пользователя user с использованием метода mysql_native_password 'не удалось с сообщением: Доступ запрещен для пользователя' user'@'202.xxx.xxx.xxx '(с использованием пароля: NO) `

Я искал его, но не нашел подходящее решение (я).

PS: live IP, который я использую, имеет azure. т.е. база данных MySQL размещена на сервере azure через xampp

Любая помощь будет принята с благодарностью

Ответы [ 7 ]

1 голос
/ 03 июня 2020

Пара возможных вариантов -

  1. Сопоставьте имя вашего сервера в строке подключения с тем, что установлено на Azure портале.
  2. Похоже, имя пользователя и пароль вы упомянутые фиктивные (что и понятно). Проверьте, есть ли в вашем фактическом имени пользователя или пароле какие-либо специальные символы, вам нужно будет соответствующим образом закодировать их, чтобы избежать.

Например, если ваш пароль - my> Pass, строка подключения должна выглядеть следующим образом. static string connstring = @"server=servername;userid=user;password=my>Pass;database=db_name;port=3306";

Вот полный список , если вы хотите исследовать.

1 голос
/ 01 июня 2020

(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-адреса может быть проблемой.

0 голосов
/ 08 июня 2020

Ваш пароль начинается с # или аналогичного символа, и вы сохраняете его в каком-то конфигурационном файле, например ini

Поскольку некоторые типы конфигурации рассматривают некоторые специальные символы как комментарии или что-то еще, пароль становится null.

Для проверки измените пароль на буквенно-цифровой c один раз и проверьте. Я столкнулся с этим со своими паролями, когда использовал password=#strongP

0 голосов
/ 08 июня 2020
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();
        }
    }
}

вы можете обратиться по ссылке ниже, чтобы создать и получить доступ к mysql db, используя c# https://docs.microsoft.com/en-us/azure/mysql/connect-csharp

0 голосов
/ 07 июня 2020

Попробуйте следующее:

const string connStr = "Server=my.live.ip; User=user; Database=db_name; Password=123; port=3306; 
    Allow Zero Datetime=true; Convert Zero Datetime=true;"; 

Надеюсь, это поможет.

0 голосов
/ 01 июня 2020

Вы можете просто посмотреть, но вот код, который я нашел:

Замените все имена пользователей порта #, имя базы паролей и 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();
}
}

}

Надеюсь, этот код сработает для вас.

Также похоже на ошибку, которую вы мне дали, что имя пользователя или пароль недействительны.

0 голосов
/ 01 июня 2020
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();
    }
}

}

...