Вы должны войти, чтобы создавать сообщения и темы.

Не работает INSERT INTO (MySQL c#)

Всем доброго, не могу понять, почему

код

command = new MySqlCommand("INSERT INTO `users`(`login`, `password`) VALUES (@uL, @uP)", db.GetConnection()); // Команда SQL
                command.Parameters.Add("@uL", MySqlDbType.VarChar).Value = login; 
                command.Parameters.Add("@uP", MySqlDbType.VarChar).Value = password; 

                adapter.SelectCommand = command; // Выполняем команду

                return "Пользователь создан";

 

не работает
Возвращается "Пользователь создан", но пользователя нет в БД
Если вписать запрос в PHPMyAdmin, то сработает (конечно если заменить Скопировано@uL, @uP)
Почему запрос не выполняется?

Помогите

Добрый день.
Очевидно же, что SelectCommand служит для выполнения запросов типа СкопированоSELECT, а для СкопированоINSERT используется InsertCommand
И по хорошему возврат типа создан / не создан нужно выдавать на основании какой-то проверки, например через тот-же СкопированоSELECT 

Лайкнули XpucT и Николай
XpucTНиколай

Спасибо, но не помогло

Посмотрел в одном своем старом проекте. Там это сделано так:

Это копипаст в упрощенном виде из хоть и не завершенного, но рабочего проекта (в исходном коде INSERT выполняется в цикле с ~75млн записей 😊) в качестве примера.

P.S. Вставил в качестве скриншота, т.к. плагин для подсветки и форматирования кода ломается на некоторых @

Не помогло(

Прикол в том что проверка на зарегистрированный аккаунт работает

Весь метод

public string Register(string login, string password)
        {
            DB db = new DB();
            DataTable table = new DataTable();
            
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            
            MySqlCommand command = new MySqlCommand("SELECT * FROM `users` WHERE `login` = @uL", db.GetConnection()); // Команда SQL
            command.Parameters.Add("@uL", MySqlDbType.VarChar).Value = login; // Заменяем заклёпки
            
            adapter.SelectCommand = command; // Выполняем команду
            adapter.Fill(table); // Получаем информацию из выполненной команды

            if (table.Rows.Count == 1) // Если, есть в таблице пользователь с указанными данными
                return "Пользователь не зарегистрирован, такой пользователь уже существует";
            else
            {
                command = new MySqlCommand("INSERT INTO `users`(`login`, `password`) VALUES (@uL, @uP)", db.GetConnection()); // Команда SQL
                command.Parameters.Add("@uL", MySqlDbType.VarChar).Value = login;
                command.Parameters.Add("@uP", MySqlDbType.VarChar).Value = password;

                adapter.InsertCommand = command; // Выполняем команду

                return "Пользователь зарегистрирован";
            }    
        }

 

  

У вас вероятно каша между db, table и adapter.
Не понятно, как это все между собой соотносится, не понятно что такое DB() и зачем вам там DataTable.

Добрый день.
Попробуйте использовать для вашей переменной MySqlCommand (command) метод ExecuteNonQuery. Он выполнит инструкцию для подключения, в Вашем случае, выполнит команду INSERT. 
Ну, а возвращает значение он в любом случе, потому что это у вас единственный путь и он единственно верный. Чтобы возвращал ошибку, можно попробовать использовать try:catch или проверять выполнение ExecuteNonQuery и в случае, если он не вернет значение задействонных строк, то выдавать ошибку, иначе успех. 

использование insert с офф. сайта

System.Data.SqlClient.SqlConnection sqlConnection1 = 
    new System.Data.SqlClient.SqlConnection("YOUR CONNECTION STRING");

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "INSERT Region (RegionID, RegionDescription) VALUES (5, 'NorthWestern')";
cmd.Connection = sqlConnection1;

sqlConnection1.Open();
cmd.ExecuteNonQuery();
sqlConnection1.Close();

Тут я бы вставил всё в using 🙂

Источник

Вообще, очень рекомендовал бы использовать EntityFramework для работы с MS SQL Server, для общего развития посоветовал бы почитать. Возможно он понравится Вам больше, нежели стандартные\устаревшие средства.

Не удержался и показал как регистрация выглядит на Entity

шпоньк

using (UserContext db = new UserContext())
                                {
                                        User user = new Users();
                                        user.login = loginString;
                                        user.password = passwordString;
                                        await db.SaveChangesAsync();
                                        return "Успех";
                                }

Писал на скорую руку, так что не сделал то, что сам указывал сверху. Однако это актуальный вариант работы с фреймворком. Чтобы сделать проверку на существование пользователя достаточно одной строки СкопированоUser user = db.Users.Find(id); или любой аналог поиска при помощи Linq.

Надеюсь был полезен. Желаю удачи!

Лайкнул Николай
Николай

Огромное спасибо
Вот

код

command = new MySqlCommand("INSERT INTO `users`(`login`, `password`) VALUES (@uL, @uP)", db.GetConnection()); // Запрос SQL
                {
                    db.OpenConnection();
                    command.Parameters.Add("@uL", MySqlDbType.VarChar).Value = login; // Заменяем заклёпки
                    command.Parameters.Add("@uP", MySqlDbType.VarChar).Value = password; // Заменяем заклёпки // Заменяем заклёпки (сложнее взломать)

                    command.ExecuteNonQuery();
                    db.CloseConnection();
                }

                return "Пользователь зарегистрирован";

С EntityFramework возникли сложности установить в проект, поэтому я по старинке)

Лайкнул Иван
Иван