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

向数据库添加数据时应用崩溃,触发System.NullReferenceException异常

解决System.NullReferenceException异常的方案

核心问题定位

你的MySQLDatabase类里,MyDatabase()是普通方法而非构造函数——构造函数不能带返回值类型(void),所以创建MySQLDatabase实例时,这个方法不会自动执行,导致conn字段始终为null,调用InsertData或CloseConnection时必然触发空引用异常。

修复步骤

1. 修正构造函数

把MyDatabase()方法改成构造函数,去掉void关键字,实例化时会自动初始化数据库连接:

public class MySQLDatabase
{
    private SQLiteConnection conn;

    // 修正为构造函数,移除void关键字
    public MySQLDatabase()
    {
        // 注意SQLite连接字符串的标准格式,需指定Data Source
        conn = new SQLiteConnection("Data Source=mydatabase.db3");
        conn.CreateTable<MyTable>();
    }

    public void InsertData(int gameid, string preorder,string rating,string standards,string overpriced,string agerating,string gameplay,string recommend,string impact)
    {
        MyTable myNewTable = new MyTable
        {
            GameId = gameid,
            PreOrder = preorder,
            Rating = rating,
            Standards = standards,
            OverPriced = overpriced,
            AgeRating = agerating,
            Gameplay = gameplay,
            Recommend = recommend,
            Impact = impact
        };
        conn.Insert(myNewTable);
    }

    public void CloseConnection()
    {
        conn.Close();
    }
}

2. 避免控件空引用

调用QuestionX.ToString()时,如果Question1等控件未正确初始化(为null),也会触发异常,建议添加空值检查:

private void Button_Pressed(object sender, EventArgs e)
{
    MySQLDatabase db = new MySQLDatabase();
    
    // 空值保护:控件为空时返回空字符串
    string q1 = Question1?.ToString() ?? string.Empty;
    string q2 = Question2?.ToString() ?? string.Empty;
    string q3 = Question3?.ToString() ?? string.Empty;
    string q4 = Question4?.ToString() ?? string.Empty;
    string q5 = Question5?.ToString() ?? string.Empty;
    string q6 = Question6?.ToString() ?? string.Empty;
    string q7 = Question7?.ToString() ?? string.Empty;
    string q8 = Question8?.ToString() ?? string.Empty;

    db.InsertData(5, q1, q8, q4, q3, q5, q6, q7, q2);
    db.CloseConnection();
}

3. 优化连接管理(可选)

为避免连接泄漏,建议显式打开连接,或者用using语句自动管理生命周期:

// 构造函数里显式打开连接
public MySQLDatabase()
{
    conn = new SQLiteConnection("Data Source=mydatabase.db3");
    conn.Open();
    conn.CreateTable<MyTable>();
}

// 或者在插入前检查连接状态
public void InsertData(...)
{
    if (conn.State != System.Data.ConnectionState.Open)
        conn.Open();
    // 插入逻辑...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:10:09