C# 通过TextBox检索SQL数据库数据绑定到ListView的代码报错求助
问题说明
- 类型转换错误:
reader[索引]返回值为object类型,而ListView.Items.Add、SubItems.Add方法仅接收字符串类型参数,未做显式类型转换会触发报错。 - 语法适配错误:C#中
SqlDataReader没有Item/item属性,VB.NET的reader.Item(索引)对应C#的原生索引器写法reader[索引]即可。 - 逻辑错误:原代码在
SqlDataReader读取数据前就提前释放了SqlCommand对象,会导致数据读取失败。 - 安全风险:直接拼接用户输入生成SQL语句存在严重SQL注入风险,且手动管理资源释放容易出现连接泄漏。
修正后可运行代码
private void TextBox1_TextChanged(object sender, EventArgs e) { ListView1.Items.Clear(); // using块会在代码执行完成后自动释放资源,无需手动调用Dispose/Close using (SqlCommand cmd = new SqlCommand("SELECT * FROM Vendors WHERE VendorName LIKE @SearchText OR VendorID LIKE @SearchText", con)) { // 参数化查询彻底避免SQL注入风险 cmd.Parameters.AddWithValue("@SearchText", $"%{TextBox1.Text}%"); con.Open(); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // 显式转字符串后构建ListViewItem,写法更简洁不易出错 ListViewItem listItem = new ListViewItem(reader[0].ToString()); listItem.SubItems.Add(reader[1].ToString()); listItem.SubItems.Add(reader[2].ToString()); listItem.SubItems.Add(reader[3].ToString()); ListView1.Items.Add(listItem); } } con.Close(); } }
内容的提问来源于stack exchange,提问作者Talat Farooq
相关产品推荐
相关产品推荐

