C# MySQL 执行 UPDATE 什么都不做

标签 c# mysql

我有一个 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/

相关文章:

php - sql count 连接表中精确或相似记录的数量

定义 INNER JOIN 表时 MySQL 存储函数语法错误

c# - 将 MS Solver Foundation 与矩阵乘法结合使用

c# - "Malay Peninsula Standard Time"的时区问题

c# - 检索刚刚添加的行的唯一 ID

php - 选择行与最新日期的SQL PHP

java - hibernate 查询中的固定字段

c# - 是否可以在属性的构造函数中获取有关类成员的元数据

C# DGV - 显示实时 MYSQL 数据库表

mysql - 以相反的方式合并