首页 > 解决方案 > 尝试更新表时无法写入 CLR 类型 C# 错误

问题描述

我有一个包含多个DataGridView组件的项目。数据库中的数据表包含这些表中的一些外键,因此我需要将它们交换为相应的值(例如,faculty_id 到 Faculty_title)。

所以我DataGridViewComboBoxColumn为那些做了一个。我在几个表中有faculty_id 外键,并且DataGridViewComboBoxColumn它们的字面意思是相同的,但似乎它只在其中一个表上工作正常。

代码之一DataGridViewComboBoxColumn

DataGridViewComboBoxColumn students_faculty_cbc = new DataGridViewComboBoxColumn()
            {
                HeaderText = "Fakultate",
                DataSource = attendanceRecording.Tables["faculties"],
                DisplayMember = "faculty_title",
                ValueMember = "faculty_id",
                DataPropertyName = "faculty_id"
            };

所以现在,当我将此列添加到 时DataGridView,我在每一行中都有一个带有下拉列表的列,可能的值是 Faculty_title。

当我更改它并尝试与数据库同步更改时,出现错误: System.InvalidCastException: 'Can't write CLR type System.String with handler type Int32Handler'

该查询也与表中的查询非常相似,它DataGridViewComboBoxColumn工作得很好。没有额外添加或没有任何遗漏。因此,例如:

NpgsqlCommand update_audiences = new NpgsqlCommand("UPDATE audiences SET audience_number = @audience_number, faculty_id = @faculty_id WHERE audience_id = @id", conn);
            update_audiences.Parameters.Add(new NpgsqlParameter("@audience_number", NpgsqlTypes.NpgsqlDbType.Varchar, 5, "audience_number"));
            update_audiences.Parameters.Add(new NpgsqlParameter("@faculty_id", NpgsqlTypes.NpgsqlDbType.Integer, sizeof(int), "faculty_id"));
            update_audiences.Parameters.Add(new NpgsqlParameter("@id", NpgsqlTypes.NpgsqlDbType.Integer, sizeof(int), "audience_id"));
NpgsqlCommand update_students = new NpgsqlCommand("UPDATE students SET " +
                                                              "student_name = @student_name, student_surname = @student_surname, matriculation_number = @matriculation_number, faculty_id = @faculty_id, " +
                                                              "course = @course, phone_number = @phone_number, email = @email, gender = @gender WHERE student_id = @id", conn);
            update_students.Parameters.Add(new NpgsqlParameter("@student_name", NpgsqlTypes.NpgsqlDbType.Varchar, 50, "student_name"));
            update_students.Parameters.Add(new NpgsqlParameter("@student_surname", NpgsqlTypes.NpgsqlDbType.Varchar, 60, "student_surname"));
            update_students.Parameters.Add(new NpgsqlParameter("@matriculation_number", NpgsqlTypes.NpgsqlDbType.Varchar, 7, "matriculation_number"));
            update_students.Parameters.Add(new NpgsqlParameter("@faculty_id", NpgsqlTypes.NpgsqlDbType.Integer, sizeof(int), "faculty_id"));
            update_students.Parameters.Add(new NpgsqlParameter("@course", NpgsqlTypes.NpgsqlDbType.Integer, sizeof(int), "course"));
            update_students.Parameters.Add(new NpgsqlParameter("@phone_number", NpgsqlTypes.NpgsqlDbType.Integer, 8, "phone_number"));
            update_students.Parameters.Add(new NpgsqlParameter("@email", NpgsqlTypes.NpgsqlDbType.Varchar, 50, "email"));
            update_students.Parameters.Add(new NpgsqlParameter("@gender", NpgsqlTypes.NpgsqlDbType.Varchar, 15, "gender"));
            update_students.Parameters.Add(new NpgsqlParameter("@id", NpgsqlTypes.NpgsqlDbType.Integer, sizeof(int), "student_id"));

我无法在这里发现问题。也许有人可以告诉我,我做错了什么?

标签: c#winformsado.net

解决方案


推荐阅读