Изменение данных в базе данных MySQL
В этой статье мы рассмотрим на нескольких простых примерах, как изменить данные в базе данных MySQL с помощью языка c#.
И так предположим, что у нас есть база данных, например myDB, которая содержит всего одну таблицу friends, состоящую буквально из двух колонок: id и name.
Создадим новое приложение типа Windows Forms Application на языке c#, после чего добавим на форму элемент управления Button.
Затем создадим новый метод, например ChangeName, с помощью которого мы будем изменять уже существующие данные в колонке name.
private void ChangeName() { }
В первом примере давайте рассмотрим, как подключиться к базе данных Mysql и изменить имя Иван на имя Василий.
private void ChangeName() { MySqlConnectionStringBuilder mysqlCSB; mysqlCSB = new MySqlConnectionStringBuilder(); mysqlCSB.Server = "127.0.0.1"; mysqlCSB.Database = "myDB"; mysqlCSB.UserID = "Vasya"; mysqlCSB.Password = "12345"; string queryString = @"UPDATE friends SET name = 'Василий' WHERE name = 'Иван' "; try { using (MySqlConnection con = new MySqlConnection()) { con.ConnectionString = mysqlCSB.ConnectionString; con.Open(); using (MySqlCommand com = new MySqlCommand(queryString, con)) { com.ExecuteNonQuery(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
Вызов метода ChangeName поместим в обработчике события Button_Click.
private void button1_Click(object sender, EventArgs e) { ChangeName(); }
Нажимаем на кнопку и получаем результат как на картинке ниже.
Более подробно о том, как работать с базой данных MySQL, можно прочитать, перейдя по ссылке.
Метод ExecuteNonQuery используется для отправки команды, которая содержит запрос: UPDATE, INSERT INTO или DELETE.
В следующем примере показано, как можно получить количество измененных записей.
using (MySqlCommand com = new MySqlCommand(queryString, con)) { int rowsAffected = com.ExecuteNonQuery(); }
В первом примере мы сразу подставили в строку запроса значения, которые нам нужно было изменить. На практике такое встречается довольно редко, так как чаще всего работа производится с динамическими данными, которые например, берутся из текстовых полей, которые заполняет пользователь.
Поэтому в следующем примере мы рассмотрим, как изменить имя Василий на имя Николай с помощью текстового поля (textBox).
1. Добавим на существующую форму два текстовых поля: txtOldName(имя в таблице, которое нужно изменить) и txtNewName (новое имя).
2. В метод ChangeName добавим два параметра:
private void ChangeName(string newName, string oldName) { }
3. Изменим sql запрос
Для удобства работы с подставляемыми значениями воспользуемся методом Format
string queryString = string.Format("UPDATE friends SET name = '{0}' WHERE name = '{1}'", newName, oldName);
Вызов
private void button1_Click(object sender, EventArgs e) { ChangeName(txtNewName.Text, txtOldName.Text); }
результат
Данный способ позволяет легко изменить данные в базе данных Mysql, но является небезопасным, так как позволяет пользователю внедриться в запрос и, например, выполнить такой тип атаки, как sql инъекция. Поэтому на практике такой способ работы практически не используется.
Параметризованный запрос
В третьем примере мы рассмотрим более безопасный способ изменения данных в базе данных MySQL с помощью так называемого параметризованного запроса.
1. Для начала в уже существующем коде создадим два параметра:
using (MySqlCommand com = new MySqlCommand(queryString, con)) { //первый параметр MySqlParameter newNameParam = new MySqlParameter(); //название параметра newNameParam.ParameterName = "@newName"; //значение newNameParam.Value = newName; //тип newNameParam.MySqlDbType = MySqlDbType.VarChar; //для типа VARCHAR укажем размер newNameParam.Size = 20; //добавляем созданный параметр в коллекцию параметров com.Parameters.Add(newNameParam); //второй параметр MySqlParameter oldNameParam = new MySqlParameter(); oldNameParam.ParameterName = "@oldName"; oldNameParam.Value = oldName; oldNameParam.MySqlDbType = MySqlDbType.VarChar; oldNameParam.Size = 20; com.Parameters.Add(oldNameParam); com.ExecuteNonQuery(); }
Все параметры должны быть созданы до того как будет выполнена команда!
2. Теперь изменим sql запрос, добавив в него созданные параметры
string queryString = @"UPDATE friends SET name = @newName WHERE name = @oldName";
Вызов:
private void button1_Click(object sender, EventArgs e) { ChangeName(txtNewName.Text, txtOldName.Text); }
Заполняем текстовые поля и нажимаем на кнопку.
Хранимые процедуры
В последнем примере мы рассмотрим наиболее безопасный способ для изменения данных, который заключается в вызове заранее созданной хранимой процедуры на сервере MySQL.
Более подробно о том, как создать хранимую процедуру можно прочитать, перейдя по ссылке.
1. И так, для начала на сервере MySQL мы создадим хранимую процедуру, например с точно таким же именем (ChangeName). Имя можно указать любое.
Имя процедуры: ChangeName
Тип: Procedure
Процедура будет принимать два входящих параметра: новое имя и старое имя
IN | newname | VARCHAR | 20 | utf8 |
IN | oldname | VARCHAR | 20 | utf8 |
Сама процедура:
BEGIN UPDATE friends SET name = newname WHERE name = oldname; END;
Затем изменим, значение параметра «Доступ к SQL данным» (SQL Data ACCESS) на MODIFIES SQL Data, так как используем оператор UPDATE.
Возвращаемся на клиентскую сторону.
1. Так как теперь отправлять sql запрос на сервер не нужно (теперь мы будем отправлять только имя процедуры, которую нужно выполнить), то на клиенте строку запроса можно либо просто закомментировать, либо вообще удалить.
2. В методе ChangeName (на клиенте) изменим, первый параметр конструктора команды, указав вместо переменной, которая содержит строку запроса, имя созданной нами хранимой процедуры.
using (MySqlCommand com = new MySqlCommand("ChangeName", con)) { }
3. Явно укажем тип команды, установив для свойства CommandType значение StoredProcedure.
com.CommandType = CommandType.StoredProcedure;
Во всех выше приведённых примерах использовался тип Text.
com.CommandType = CommandType.Text;
Он используется по умолчанию, поэтому обычно его не указывают явно.
4. Созданная нами процедура принимает два входящих параметра, которые мы уже создали (на клиенте) в предыдущем примере.
С помощью свойства Direction вы можете явно указать для каждого параметра направление, например:
MySqlParameter newNameParam = new MySqlParameter(); newNameParam.ParameterName = "@newName"; newNameParam.Value = newName; //входящий (IN) newNameParam.Direction = ParameterDirection.Input;
В данном примере делать это необязательно так как (по умолчанию) каждый созданный параметр уже является входящим.
Часть которая изменилась:
try { using (MySqlConnection con = new MySqlConnection()) { con.ConnectionString = mysqlCSB.ConnectionString; con.Open(); //sql запрос удалён //указываем имя процедуры using (MySqlCommand com = new MySqlCommand("ChangeName", con)) { //явно указываем тип команды com.CommandType = CommandType.StoredProcedure; //два входящих параметра для хранимой процедуры MySqlParameter newNameParam = new MySqlParameter(); newNameParam.ParameterName = "@newName"; newNameParam.Value = newName; newNameParam.MySqlDbType = MySqlDbType.VarChar; newNameParam.Size = 20; newNameParam.Direction = ParameterDirection.Input; com.Parameters.Add(newNameParam); MySqlParameter oldNameParam = new MySqlParameter(); oldNameParam.ParameterName = "@oldName"; oldNameParam.Value = oldName; oldNameParam.MySqlDbType = MySqlDbType.VarChar; oldNameParam.Size = 20; com.Parameters.Add(oldNameParam); com.ExecuteNonQuery(); } } }
Вызов:
private void button1_Click(object sender, EventArgs e) { ChangeName(txtNewName.Text, txtOldName.Text); }
Создавать параметры также можно с помощью короткой записи:
//создаём параметр newName, который берёт значение из текстового поля com.Parameters.AddWithValue("@newName", txtName.Text);
//изменение свойства созданного параметра com.Parameters["@newName"].Direction = ParameterDirection.Input;
Вот в принципе и всё, если есть вопросы, то оставляйте их в комментариях или на форуме.
Читайте также:
Хорошо бы показать, как можно менять данные в базе с помощью DataGridView, причём на сложных запросах, где соединяется сразу несколько таблиц.
По замене текста я использовал вот этот вариант может кому пригодится — https://www.youtube.com/watch?v=U3hMBViOnHU