You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:32:32