Не работает INSERT INTO (MySQL c#)
Цитата: Николай от 09.10.2022, 19:38Всем доброго, не могу понять, почему [spoiler title="код"]
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 "Пользователь создан";
[/spoiler] не работает
Возвращается "Пользователь создан", но пользователя нет в БД
Если вписать запрос в PHPMyAdmin, то сработает (конечно если заменить@uL, @uP)
Почему запрос не выполняется?Помогите
Всем доброго, не могу понять, почему
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)Почему запрос не выполняется?
Помогите
Цитата: Adler от 09.10.2022, 20:22Добрый день.
Очевидно же, что SelectCommand служит для выполнения запросов типаSELECT, а дляINSERTиспользуется InsertCommand
И по хорошему возврат типа создан / не создан нужно выдавать на основании какой-то проверки, например через тот-жеSELECT
Добрый день.
Очевидно же, что SelectCommand служит для выполнения запросов типа СкопированоSELECT, а для СкопированоINSERT используется InsertCommand
И по хорошему возврат типа создан / не создан нужно выдавать на основании какой-то проверки, например через тот-же СкопированоSELECT
Цитата: Николай от 09.10.2022, 20:26Спасибо, но не помогло
Спасибо, но не помогло
Цитата: Adler от 09.10.2022, 20:46Посмотрел в одном своем старом проекте. Там это сделано так:
Это копипаст в упрощенном виде из хоть и не завершенного, но рабочего проекта (в исходном коде INSERT выполняется в цикле с ~75млн записей 😊) в качестве примера.P.S. Вставил в качестве скриншота, т.к. плагин для подсветки и форматирования кода ломается на некоторых @
Посмотрел в одном своем старом проекте. Там это сделано так:
Это копипаст в упрощенном виде из хоть и не завершенного, но рабочего проекта (в исходном коде INSERT выполняется в цикле с ~75млн записей 😊) в качестве примера.
P.S. Вставил в качестве скриншота, т.к. плагин для подсветки и форматирования кода ломается на некоторых @
Цитата: Николай от 09.10.2022, 21:16Не помогло(
Прикол в том что проверка на зарегистрированный аккаунт работает
[spoiler title="Весь метод"]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 "Пользователь зарегистрирован"; } }
[/spoiler]
Не помогло(
Прикол в том что проверка на зарегистрированный аккаунт работает
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 "Пользователь зарегистрирован";
}
}
Цитата: Adler от 09.10.2022, 21:22У вас вероятно каша между db, table и adapter.
Не понятно, как это все между собой соотносится, не понятно что такое DB() и зачем вам там DataTable.
У вас вероятно каша между db, table и adapter.
Не понятно, как это все между собой соотносится, не понятно что такое DB() и зачем вам там DataTable.
Цитата: Иван от 10.10.2022, 14:49Добрый день.
Попробуйте использовать для вашей переменной MySqlCommand (command) метод ExecuteNonQuery. Он выполнит инструкцию для подключения, в Вашем случае, выполнит команду INSERT.
Ну, а возвращает значение он в любом случе, потому что это у вас единственный путь и он единственно верный. Чтобы возвращал ошибку, можно попробовать использовать try:catch или проверять выполнение ExecuteNonQuery и в случае, если он не вернет значение задействонных строк, то выдавать ошибку, иначе успех.[spoiler title="использование 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 🙂
Источник
[/spoiler]Вообще, очень рекомендовал бы использовать EntityFramework для работы с MS SQL Server, для общего развития посоветовал бы почитать. Возможно он понравится Вам больше, нежели стандартные\устаревшие средства.
Не удержался и показал как регистрация выглядит на Entity
[spoiler title="шпоньк"]
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.[/spoiler]Надеюсь был полезен. Желаю удачи!
Добрый день.
Попробуйте использовать для вашей переменной MySqlCommand (command) метод ExecuteNonQuery. Он выполнит инструкцию для подключения, в Вашем случае, выполнит команду INSERT.
Ну, а возвращает значение он в любом случе, потому что это у вас единственный путь и он единственно верный. Чтобы возвращал ошибку, можно попробовать использовать try:catch или проверять выполнение ExecuteNonQuery и в случае, если он не вернет значение задействонных строк, то выдавать ошибку, иначе успех.
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.
Надеюсь был полезен. Желаю удачи!
Цитата: Николай от 10.10.2022, 16:00Огромное спасибо
Вот [spoiler title="код"]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 "Пользователь зарегистрирован";[/spoiler]С EntityFramework возникли сложности установить в проект, поэтому я по старинке)
Огромное спасибо
Вот
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 "Пользователь зарегистрирован";
