我有一个 DataGridView,它在表格中显示学生列表及其信息。一列名为“等级”是可编辑的,因此我希望在用户单击“保存更改”按钮时反映对数据库的所有更改。
我写了这段代码,但由于某种原因它不起作用:
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
属性都包含有效数据。
我已经在 SQLyog 中测试了 MySQL 查询,它应该在那里工作
好像updateCommand.ExecuteNonQuery();
没有执行。
编辑:我添加了一些东西,但它仍然无法正常工作。新代码是
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 行受影响的结果。诡异的
EDIT3:我发现了问题所在。该数据库包含克罗地亚语字母 (čćšđž),因此当它们在命令中时,该命令不会执行。我认为这与字符编码有关。当命令仅包含常规(ASCII)字母时,它可以正常工作。我不确定如何解决它,但至少现在我知道问题出在哪里
EDIT4:问题已解决。将数据库排序规则更改为 utf8