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

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集合:

  1. 在窗口类或ViewModel中定义可观察集合作为绑定源
  2. 将ListBox的ItemsSource绑定到该集合
  3. 查询数据后直接更新集合,界面会自动刷新

示例代码:

// 在窗口类中定义绑定集合
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:01:07