C#中使用TableAdapter.Update()从DataGridView更新Oracle表时DataTable对象为空问题求助
问题分析与解决方案
兄弟,你这段代码的核心问题是类型完全不匹配——你试图把DataGridView单元格里的单个字段值(比如某一列的文本/数字)强行转换成ANGAJATDataTable,这根本行不通!单元格里存的是单条记录的某个字段,而不是整个数据表,所以da变量肯定一直是null。
咱们直接来解决问题,根据你不想用常规数据集更新的需求,给你两个可行方案:
方案一:利用DataGridView绑定的DataRow直接更新(简单高效)
如果你的aNGAJATDataGridView是绑定到ANGAJATDataTable的(这是WinForms里常用的做法),那每一行的DataBoundItem就是对应的数据行对象,直接用它来调用TableAdapter的Update即可:
private void button12_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in aNGAJATDataGridView.Rows) { // 跳过用户还没输入的新行 if (row.IsNewRow) continue; // 获取当前行对应的ANGAJAT数据行 var angajatRow = row.DataBoundItem as ANGAJATRow; if (angajatRow != null) { // 直接更新这条记录 this.aNGAJATTableAdapter.Update(angajatRow); } else { MessageBox.Show("无法读取当前行的记录信息"); } } MessageBox.Show("更新操作完成"); }
方案二:手动构造参数化SQL更新(完全脱离数据集)
如果你不想依赖绑定的数据集,完全手动从单元格提取数据来更新,推荐用参数化SQL(避免SQL注入,也更安全):
private void button12_Click(object sender, EventArgs e) { // 替换成你的ANGAJAT表实际字段和更新逻辑,这里假设主键是ID,还有NUME、PRENUME字段 string updateSql = "UPDATE ANGAJAT SET NUME = :nume, PRENUME = :prenume WHERE ID = :id"; // 使用Oracle连接,替换成你的实际连接字符串 using (var conn = new OracleConnection("你的Oracle数据库连接字符串")) { conn.Open(); foreach (DataGridViewRow row in aNGAJATDataGridView.Rows) { if (row.IsNewRow) continue; // 从单元格提取值,注意处理可能的空值 int id = Convert.ToInt32(row.Cells["ID列的名称"].Value); string nume = row.Cells["NUME列的名称"].Value?.ToString() ?? string.Empty; string prenume = row.Cells["PRENUME列的名称"].Value?.ToString() ?? string.Empty; using (var cmd = new OracleCommand(updateSql, conn)) { // 添加参数,避免SQL注入风险 cmd.Parameters.Add(":id", OracleDbType.Int32).Value = id; cmd.Parameters.Add(":nume", OracleDbType.Varchar2).Value = nume; cmd.Parameters.Add(":prenume", OracleDbType.Varchar2).Value = prenume; // 执行更新,返回受影响的行数 int rowsUpdated = cmd.ExecuteNonQuery(); if (rowsUpdated == 0) { MessageBox.Show($"ID为{id}的记录未找到或没有修改"); } } } conn.Close(); } MessageBox.Show("全部更新完成"); }
为什么你的原代码会失败?
再强调一下:row.Cells[1].Value是该行第二列的单个值(比如员工的名字),它的类型可能是string、int或者DBNull,但绝对不可能是ANGAJATDataTable(这是整个数据表的类型)。强制转换不同类型的对象,结果必然是null,这是类型不匹配的基础问题。
内容的提问来源于stack exchange,提问作者Cristina Moroti
相关产品推荐
相关产品推荐

