C# WinForm重启后DataGridView不显示SQLite已存储数据问题
问题根因
- 核心原因:
LoadData数据加载方法的查询逻辑默认依赖txtBid文本框的输入值,窗体初始化调用该方法时,txtBid没有任何输入内容,生成的查询语句为Select * From Student where BorrowerId='',匹配不到任何数据库记录,因此DataGridView为空。
保存后能正常显示是因为此时txtBid已经填入了对应的值,查询可以匹配到刚插入的数据。 - 其他已知问题:
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
相关产品推荐
相关产品推荐

