У меня есть DataGridView, который отображает список учеников и их информацию в таблице. Один столбец с именем «Оценка» доступен для редактирования, поэтому я хочу отразить все изменения в базе данных, когда пользователь нажимает кнопку «Сохранить изменения».C# MySQL, выполняющий UPDATE ничего не делает
Я написал этот код, но по какой-то причине он не работает:
private void bttnStudentsSaveChanges_Click(object sender, EventArgs e)
{
try
{
if (connection.State == ConnectionState.Closed) connection.Open();
DataTable changes = ((DataView)dataGridViewStudents.DataSource).Table.GetChanges();
if (changes != null)
{
foreach (DataRow row in changes.Rows)
{
MySqlCommand updateCommand = connection.CreateCommand();
updateCommand.CommandText = @"UPDATE grades
INNER JOIN lectures ON grades.idLecture = lectures.id
INNER JOIN students ON grades.idStudent = students.id
SET grades.grade = '" + row["Grade"] + @"'
WHERE students.id = '" + row["ID"] +
@"' AND (students.name = '" + row["Name"] +
@"' AND students.surname = '" + row["Surname"] +
"') AND lectures.name = '" + row["Lecture"] + "'";
updateCommand.ExecuteNonQuery();
}
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
Когда выполняется нет никаких изменений, внесенных в базу данных.
Поскольку мне нужно объединить несколько таблиц, я не могу использовать MySqlCommandBuilder (по крайней мере, я думаю, что это причина, так как я пробовал и получил об этом ошибку), поэтому я решил сделать это вручную.
Я поставил пару контрольных точек, чтобы проверить правильность данных и переменную changes
, а свойство CommandText
содержит действительные данные.
Я проверил запрос MySQL в SQLyog и работал там, как должно
Это как если updateCommand.ExecuteNonQuery();
не выполняет.
EDIT: Я добавил несколько вещей, но он все еще не работает. Новый код
private void bttnStudentsSaveChanges_Click(object sender, EventArgs e)
{
try
{
connection.Open();
DataTable changes = ((DataView)dataGridViewStudents.DataSource).Table.GetChanges();
if (changes != null)
{
foreach (DataRow row in changes.Rows)
{
MySqlCommand updateCommand = connection.CreateCommand();
updateCommand.CommandText = @"UPDATE grades
INNER JOIN lectures ON grades.idLecture = lectures.id
INNER JOIN students ON grades.IDStudent = students.ID
SET grades.grade = @grade
WHERE students.ID = @ID AND (students.name = @name AND students.surname = @surname)
AND lectures.name = @lecture";
updateCommand.Parameters.AddWithValue("@grade", row["Grade"]);
updateCommand.Parameters.AddWithValue("@ID", row["ID"]);
updateCommand.Parameters.AddWithValue("@name", row["Name"]);
updateCommand.Parameters.AddWithValue("@surname", row["Surname"]);
updateCommand.Parameters.AddWithValue("@lecture", row["Lecture"]);
updateCommand.ExecuteNonQuery();
}
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
finally
{
if(connection.State == ConnectionState.Open) connection.Close();
}
}
EDIT2: я узнал, что ExecuteNonQuery
возвращает число изменяемых строк. В результате я получаю 0. Что странно, так как команда, выполняемая в SQLyog, дает в результате 1 строку. Weird
EDIT3: Я выяснил, в чем проблема. База данных содержит хорватские буквы (čćšđž), поэтому, когда они находятся в команде, команда не выполняется. Я думаю, что это как-то связано с кодировкой символов. Когда команда содержит только обычные (ASCII) буквы, она работает нормально. Я не уверен, как это исправить, но по крайней мере сейчас я знаю, где находится проблема
EDIT4: Проблема решена. Изменено сопоставление базы данных с utf8
Вы подтвердили, что sql работает вне программы? –
Какой тип оценки. У вас есть потенциальная инъекция для инъекций sql. –
Включите отладку и проверьте CommandText. Скорее всего, экспансия - это предложение where, которое не заполнено, и нет совпадений. –