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

System.NullReferenceException异常求助:dc.SubmitChanges执行报错

问题分析与解决方案

核心问题定位

你遇到的NullReferenceException主要由以下几个错误导致:

  1. 完全错误的空判断逻辑:刚实例化的Employee对象,值类型属性(e_id、salary)默认值是0而非null,字符串属性默认是null。你的判断逻辑完全搞反了——应该检查输入文本框的内容,而非新创建对象的属性。
  2. DataContext可能未正确初始化:如果CompanyDBDataContext的连接字符串配置错误,或者LINQ to SQL的表映射(.dbml文件)存在问题,会导致dc.Employees为null,调用SubmitChanges时触发空引用异常。
  3. 未处理非法输入:直接用int.Parse/long.Parse处理文本框内容,若为空或非数字会抛出格式异常,间接引发后续错误。

修复步骤与完整代码

1. 修正空判断逻辑

将判断对象属性改为检查输入文本框,确保必填字段不为空:

if (string.IsNullOrWhiteSpace(textBox1.Text) ||
    string.IsNullOrWhiteSpace(textBox2.Text) ||
    string.IsNullOrWhiteSpace(textBox3.Text) ||
    string.IsNullOrWhiteSpace(textBox4.Text) ||
    string.IsNullOrWhiteSpace(textBox5.Text))
{
    MessageBox.Show("请填写所有必填字段!");
    return;
}

2. 安全解析数字输入

用TryParse替代直接Parse,避免格式异常:

int eId;
if (!int.TryParse(textBox1.Text, out eId))
{
    MessageBox.Show("员工ID必须是整数!");
    textBox1.Focus();
    return;
}

long salary;
if (!long.TryParse(textBox4.Text, out salary))
{
    MessageBox.Show("薪资必须是数字!");
    textBox4.Focus();
    return;
}

3. 确保DataContext正确初始化

显式传入连接字符串,避免配置文件问题;同时用using语句自动释放资源:

string connectionString = "Data Source=你的服务器地址;Initial Catalog=CompanyDB;Integrated Security=True;";
using (CompanyDBDataContext dc = new CompanyDBDataContext(connectionString))
{
    // 插入逻辑
}

4. 完整修复后的按钮点击事件

private void button1_Click(object sender, EventArgs e)
{
    // 检查输入完整性
    if (string.IsNullOrWhiteSpace(textBox1.Text) ||
        string.IsNullOrWhiteSpace(textBox2.Text) ||
        string.IsNullOrWhiteSpace(textBox3.Text) ||
        string.IsNullOrWhiteSpace(textBox4.Text) ||
        string.IsNullOrWhiteSpace(textBox5.Text))
    {
        MessageBox.Show("请填写所有必填字段!");
        return;
    }

    // 安全解析数字类型
    int eId;
    if (!int.TryParse(textBox1.Text, out eId))
    {
        MessageBox.Show("员工ID格式错误,请输入整数!");
        textBox1.Focus();
        return;
    }

    long salary;
    if (!long.TryParse(textBox4.Text, out salary))
    {
        MessageBox.Show("薪资格式错误,请输入数字!");
        textBox4.Focus();
        return;
    }

    // 初始化DataContext并执行插入
    string connectionString = "Data Source=你的服务器地址;Initial Catalog=CompanyDB;Integrated Security=True;";
    using (CompanyDBDataContext dc = new CompanyDBDataContext(connectionString))
    {
        Employee obj = new Employee();
        obj.e_id = eId;
        obj.e_name = textBox2.Text;
        obj.job = textBox3.Text;
        obj.salary = salary;
        obj.d_name = textBox5.Text;

        try
        {
            dc.Employees.InsertOnSubmit(obj);
            dc.SubmitChanges();
            MessageBox.Show("记录已成功插入!");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"插入失败:{ex.Message}");
        }
    }
}

额外建议

  • 检查LINQ to SQL的.dbml文件,确保Employee类与数据库Employees表的字段完全映射,无缺失或错误。
  • 如果e_id是数据库自增主键,无需手动赋值,删除obj.e_id = eId;这一行,避免主键冲突。
  • 始终用using包裹DataContext,确保数据库连接及时释放。

内容的提问来源于stack exchange,提问作者user17409507

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:16:05