WPF中如何在ListBox中正确显示数据库查询结果
解决WPF ListBox正确显示数据库查询结果的问题
问题根源
你的代码存在几个关键问题:
- 错误访问DataTable行数据:
rows.Rows["OprUser"]写法错误,Rows是DataRow集合,不能直接用列名索引,需要遍历每一行并获取对应列的值。 - 多余的异步调用:
cmd.ExecuteNonQueryAsync()是冗余操作,DataAdapter的Fill方法会自行执行查询,异步调用反而可能引发时序问题。 - 未遍历查询结果:当前只尝试添加第一行数据(写法还错误),没有遍历所有查询到的结果。
- SQL注入风险:直接拼接用户输入到SQL语句中,存在安全隐患。
修正后的代码
// 使用参数化查询避免SQL注入 string sql = "SELECT OprUser FROM Register WHERE OprUser LIKE ? GROUP BY OprUser"; OleDbCommand cmd = new OleDbCommand(sql); cmd.Connection = conn; // 将通配符整合到参数值中,避免注入风险 cmd.Parameters.AddWithValue("@OprUser", $"%{txt_owner.Text}%"); conn.Open(); lstowner.Items.Remove(txt_owner.Text); OleDbDataAdapter da = new OleDbDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); if (dt.Rows.Count > 0) { lstowner.Items.Clear(); // 遍历所有查询结果行,获取每行的OprUser值 foreach (DataRow row in dt.Rows) { string oprUser = row["OprUser"].ToString(); lstowner.Items.Add(oprUser); } } conn.Close();
更规范的WPF数据绑定方式
如果想遵循WPF的设计模式,推荐用数据绑定替代直接操作Items集合:
- 在窗口类或ViewModel中定义可观察集合作为绑定源
- 将ListBox的
ItemsSource绑定到该集合 - 查询数据后直接更新集合,界面会自动刷新
示例代码:
// 在窗口类中定义绑定集合 public ObservableCollection<string> OprUsers { get; set; } = new ObservableCollection<string>(); // 窗口构造函数中设置绑定 lstowner.ItemsSource = OprUsers; // 查询数据时更新集合 if (dt.Rows.Count > 0) { OprUsers.Clear(); foreach (DataRow row in dt.Rows) { OprUsers.Add(row["OprUser"].ToString()); } }
额外注意事项
- 建议用
using语句管理数据库连接,自动释放资源避免泄漏:
using (OleDbConnection conn = new OleDbConnection(你的连接字符串)) { // 执行查询逻辑 }
- 异步场景下可使用
await da.FillAsync(dt)替代同步Fill,避免阻塞UI线程。
内容的提问来源于stack exchange,提问作者Mahdieh.Tarikhchi
相关产品推荐
相关产品推荐

