Я пытаюсь создать сервер API, и мне нужен доступ к базе данных MySQL. У меня есть этот фрагмент кода:

public static class Database
{
        private const string ConnectionString = "Server=localhost;Port=3306;Database=contoso_inc;Uid=root;Pwd=f6e527xp;";

        public static IEnumerable<User> Execute(string query)
        {
            using (var connection = new SqlConnection(ConnectionString))
            {
                var command = new SqlCommand(query, connection);
                connection.Open();
                
                var reader = command.ExecuteReader();
                var result = new List<User>();
                
                while (reader.Read())
                {
                    var user = new User
                    {
                        year = (uint) reader.GetValue(0),
                        month = (string) reader.GetValue(1),
                        users_num = (uint) reader.GetValue(2)
                    };
                    
                    result.Add(user);

                }
                
                reader.Close();

                return result;
            }
        }
}

Ошибка появляется в этой строке: connection.Open();. Похоже, что по какой-то причине я не могу использовать порт. В чем проблема?

P.S. Я видел похожие вопросы, но большинство из них относятся к теме Entity Framework. У меня здесь нет DbContext, так что это не помогло.

0
Aleksandr Novik 17 Сен 2021 в 16:50

3 ответа

Лучший ответ

Я думаю, вы используете не тот драйвер для подключения. попробуйте установить этот пакет nuget

Install-Package MySql.Data -Version 8.0.26

Тогда вы можете сделать что-то вроде этого.

 public static class Database
{
        private const string ConnectionString = "Server=localhost;Port=3306;Database=contoso_inc;Uid=root;Pwd=f6e527xp;";

        public static IEnumerable<User> Execute(string query)
        {
            using (var connection = new MySql.Data.MySqlClient.MySqlConnection(ConnectionString))
            {
                var command = new MySqlCommand(query, connection);
                connection.Open();
                
                var reader = command.ExecuteReader();
                var result = new List<User>();
                
                while (reader.Read())
                {
                    var user = new User
                    {
                        year = (uint) reader.GetValue(0),
                        month = (string) reader.GetValue(1),
                        users_num = (uint) reader.GetValue(2)
                    };
                    
                    result.Add(user);

                }
                
                reader.Close();

                return result;
            }
        }
}
1
Alisom Martins 17 Сен 2021 в 14:16

Порт указан в ключевом слове Server, в вашем примере используйте:

"Server=localhost, 3306;Database=contoso_inc;Uid=root;Pwd=f6e527xp;"

Строка подключения задокументирована здесь: https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring?view=dotnet-plat-ext-5.0

1
angal 17 Сен 2021 в 13:57

Изучите документацию для SqlConnection.ConnectionString, я не вижу никаких признаков ключа для "порта". Если вам нужно указать порт, вы можете сделать это в части Server:

Имя или сетевой адрес экземпляра SQL Server, к которому нужно подключиться. Номер порта можно указать после имени сервера:

server=tcp:servername, portnumber

Так что, возможно, вы захотите: «Server = localhost, 3306; ...» или «Server = tcp: localhost, 3306; ...» - если вы действительно думаете, что вам действительно нужно указать порт вообще.

1
Jon Skeet 17 Сен 2021 в 13:58