gpt4 book ai didi

C# MySQL 执行 UPDATE 什么都不做

转载 作者:行者123 更新时间:2023-11-29 06:48:47 26 4
gpt4 key购买 nike

我有一个 DataGridView,它在表格中显示学生列表及其信息。名为“成绩”的一列是可编辑的,因此我希望在用户单击“保存更改”按钮时反射(reflect)对数据库的所有更改。

我写了这段代码,但由于某些原因它不起作用:

    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

最佳答案

如果数据库类型中有整数,则不需要为参数提供单引号。尝试在数字类型中不使用单引号。

您可以避免所有这些问题,更安全的方法是使用参数化查询

编辑

当你获取行值时,你可以根据类型获取它,如下所示

row.Field<int>("ID")

像下面这样更改你的代码,再次检查类型

updateCommand.Parameters.AddWithValue("@grade",  row.Field<int>("Grade"));
updateCommand.Parameters.AddWithValue("@ID", row.Field<int>("ID"));
updateCommand.Parameters.AddWithValue("@name", row.Field<string>("Name"));
updateCommand.Parameters.AddWithValue("@surname", row.Field<string>("Surname"));
updateCommand.Parameters.AddWithValue("@lecture", row.Field<string>("Lecture");

关于C# MySQL 执行 UPDATE 什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16882557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com