如何实现TextBox输入数据存库并与数据库数据同步显示至ListBox?
问题分析与修复方案
嘿,我一眼就看出你的代码里的核心问题了——你只做了读取数据库现有数据的操作,却没把新输入的用户信息写入数据库,而且后面的内存集合操作和ListBox的数据源完全不搭边,所以新用户肯定不会显示出来!
具体问题点:
- 点击按钮时,你直接用
SqlDataAdapter查询了数据库的Persoon表,但没有执行插入语句把tb_naam和tb_geslacht的内容存进数据库。 personen.Add(nieuwpersoon)只是在内存里添加了对象,但ListBox的数据源是从数据库查出来的DataTable,不是这个personen集合,所以那段判断lb_gebruikers.DataSource == personen的代码永远不会触发,完全无效。
修复后的完整代码:
private void button1_Click(object sender, EventArgs e) { // 先获取输入框内容,做简单的非空校验 string naam = tb_naam.Text.Trim(); string geslacht = tb_geslacht.Text.Trim(); if (string.IsNullOrEmpty(naam)) { MessageBox.Show("请输入姓名!"); return; } // 第一步:把新用户插入到数据库 string insertQuery = "INSERT INTO Persoon (Naam, Geslacht) VALUES (@Naam, @Geslacht)"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // 使用参数化查询,防止SQL注入 using (SqlCommand insertCmd = new SqlCommand(insertQuery, connection)) { insertCmd.Parameters.AddWithValue("@Naam", naam); insertCmd.Parameters.AddWithValue("@Geslacht", geslacht); insertCmd.ExecuteNonQuery(); // 执行插入操作 } } // 第二步:重新查询数据库的所有数据,绑定到ListBox using (SqlConnection connection = new SqlConnection(connectionString)) using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Persoon", connection)) { DataTable PersoonTable = new DataTable(); adapter.Fill(PersoonTable); lb_gebruikers.DisplayMember = "Naam"; lb_gebruikers.ValueMember = "Id"; lb_gebruikers.DataSource = PersoonTable; } // 清空输入框,提升用户体验 tb_naam.Clear(); tb_geslacht.Clear(); }
额外说明:
- 我添加了参数化查询,这能有效防止SQL注入攻击,比直接拼接字符串安全得多。
- 增加了输入非空校验,避免插入空的姓名到数据库。
- 插入完成后重新查询数据库并绑定,这样ListBox就能同时显示原有数据和新添加的数据了。
- 最后清空输入框,方便用户继续添加下一个用户。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

