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

C# WinForm重启后DataGridView不显示SQLite已存储数据问题

问题根因
  1. 核心原因:LoadData数据加载方法的查询逻辑默认依赖txtBid文本框的输入值,窗体初始化调用该方法时,txtBid没有任何输入内容,生成的查询语句为Select * From Student where BorrowerId='',匹配不到任何数据库记录,因此DataGridView为空。
    保存后能正常显示是因为此时txtBid已经填入了对应的值,查询可以匹配到刚插入的数据。
  2. 其他已知问题:
  • txtBid_TextChanged事件中定义了查询tblborrower表的SQL语句但从未执行,直接判断全局DT的行数,逻辑完全不生效
  • 直接拼接SQL的写法存在SQL注入风险
  • 数据库连接未正确释放,缺少资源回收逻辑
修复方案

1. 调整LoadData查询逻辑

修改LoadData方法,在txtBid为空时默认查询Student表的所有数据,同时改用参数化查询避免SQL注入,用using块自动释放数据库资源:

private void LoadData()
{
    setConnection();
    using (con)
    {
        con.Open();
        string commandText;
        // 文本框为空时查询全部数据,不为空时按BorrowerId过滤
        if (string.IsNullOrWhiteSpace(txtBid.Text))
        {
            commandText = "SELECT * FROM Student";
        }
        else
        {
            commandText = "SELECT * FROM Student WHERE BorrowerId = @Bid";
        }
        using (var cmd = new SQLiteCommand(commandText, con))
        {
            if (!string.IsNullOrWhiteSpace(txtBid.Text))
            {
                cmd.Parameters.AddWithValue("@Bid", txtBid.Text);
            }
            DB = new SQLiteDataAdapter(cmd);
            DS.Reset();
            DB.Fill(DS);
            DT = DS.Tables[0];
            dtg_ABorrowLists.DataSource = DT;
        }
    }
}

2. 修复txtBid_TextChanged事件逻辑

补全事件中的查询执行逻辑,匹配tblborrower表的查询需求:

private void txtBid_TextChanged(object sender, EventArgs e)
{
    if (string.IsNullOrWhiteSpace(txtBid.Text))
    {
        clearme();
        btn_delete.Enabled = false;
        LoadData();
        return;
    }
    // 执行tblborrower表查询
    setConnection();
    using (con)
    {
        con.Open();
        string sql = "SELECT * FROM `tblborrower` WHERE `BorrowerId` = @Bid";
        using (var cmd = new SQLiteCommand(sql, con))
        {
            cmd.Parameters.AddWithValue("@Bid", txtBid.Text);
            using (var reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    txt_fname.Text = reader["Firstname"].ToString();
                    txt_lname.Text = reader["Lastname"].ToString();
                    txtAddress.Text = reader["Address"].ToString();
                    txtContact.Text = reader["ContactNo"].ToString();
                    txtCourse.Text = reader["CourseYear"].ToString();
                    rdio_female.Checked = reader["Sex"].ToString() == "Female";
                    rdio_male.Checked = !rdio_female.Checked;
                    btn_delete.Enabled = true;
                }
                else
                {
                    clearme();
                    btn_delete.Enabled = false;
                }
            }
        }
    }
    // 按当前输入过滤DataGridView内容
    LoadData();
}

可选优化

可以将ExecuteQuery方法也改造为支持参数化查询,避免插入、删除操作的SQL注入风险。

内容的提问来源于stack exchange,提问作者Ernest Jan Sandoval

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:57:05