C#技术问询:如何检查Access数据库中指定值是否存在并处理异常
问题分析与修正代码
你的代码存在几个关键问题导致逻辑失效:
- 重复调用
Fill方法:oda.Fill(dt)会执行查询并返回受影响的行数(整数类型),不可能等于null,而且多次调用会重复填充数据,导致判断逻辑完全错误。 - 错误的存在性判断逻辑:应该通过
DataTable.Rows.Count判断是否查询到数据,而不是比较Fill的返回值。 - SQL注入风险:直接拼接用户输入到SQL语句中,存在安全隐患,必须使用参数化查询。
- 未正确释放数据库资源:数据库连接和适配器未用
using语句包裹,可能导致资源泄漏。 - 硬编码列索引:直接用
dt.Rows[0][1]这种索引访问,可读性差且容易因表结构变化出错,建议改用列名。
修正后的代码:
// 使用using自动释放连接资源 using (OleDbConnection olcn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TestUser\Documents\testlist.mdb")) { // 参数化查询避免SQL注入 string sql = "select * from testlist where num = @Num"; OleDbDataAdapter oda = new OleDbDataAdapter(sql, olcn); oda.SelectCommand.Parameters.AddWithValue("@Num", textBox11.Text); DataTable dt = new DataTable(); oda.Fill(dt); // 判断是否查询到数据 if (dt.Rows.Count == 0) { label12.Show(); } else { DataRow row = dt.Rows[0]; // 建议用列名代替索引,比如row["列名"].ToString() textBox1.Text = row[1].ToString(); textBox2.Text = row[2].ToString(); textBox3.Text = row[3].ToString(); textBox4.Text = row[4].ToString(); textBox5.Text = row[5].ToString(); textBox6.Text = row[6].ToString(); textBox7.Text = row[7].ToString(); textBox8.Text = row[8].ToString(); textBox9.Text = row[9].ToString(); textBox10.Text = row[10].ToString(); string imgPath1 = row[11].ToString(); if (!string.IsNullOrEmpty(imgPath1)) { pictureBox1.Load(imgPath1); } else { pictureBox1.Load(row[12].ToString()); } } }
关键修正点说明:
- 用
using包裹OleDbConnection,确保连接自动关闭释放。 - 改用参数化查询,将用户输入作为参数传入,避免SQL注入同时避免字符串拼接的格式问题(比如num是数字类型时不需要加引号)。
- 通过
dt.Rows.Count == 0判断是否没有匹配数据,此时显示label12。 - 查询到数据时直接取第一行数据赋值,避免重复调用Fill。
- 提取DataRow变量简化代码,同时建议替换硬编码索引为实际列名,提升代码可维护性。
内容的提问来源于stack exchange,提问作者user2619426
相关产品推荐
相关产品推荐

