如何在填充DataTable前判断OleDbDataAdapter是否查询到指定产品?
解决方案
当然可以实现!你完全能在填充DataTable之前就确认指定产品ID是否存在,不用等到数据加载完成后再判断。这里有两个实用的方案供你参考:
方案1:先执行COUNT查询(高效轻量)
这种方法不需要拉取实际的产品数据,只通过统计匹配的行数来判断是否存在,性能更优,尤其适合只需要确认存在性的场景。
int productId; // 先验证输入有效性,避免转换失败 if (!int.TryParse(txtProductId.Text, out productId)) { MessageBox.Show("请输入有效的产品ID"); return; } bool productExists = false; string countQuery = $"SELECT COUNT(*) FROM [{sheetName}$A1:Q15535] WHERE [ProductID] = ?"; using (OleDbConnection cnnxls = new OleDbConnection(strConn)) { cnnxls.Open(); using (OleDbCommand cmd = new OleDbCommand(countQuery, cnnxls)) { // 使用参数化查询,养成安全规范的编码习惯 cmd.Parameters.AddWithValue("@ProductID", productId); // ExecuteScalar返回查询结果的第一行第一列,这里就是匹配的行数 int matchCount = (int)cmd.ExecuteScalar(); productExists = matchCount > 0; } } // 根据存在性判断后续操作 if (productExists) { // 执行原有的数据填充逻辑 string fieldSelector = "[ProductID], [ProductName],[MRP]"; string query = $"SELECT {fieldSelector} FROM [{sheetName}$A1:Q15535] WHERE [ProductID] = ?"; using (OleDbConnection cnnxls = new OleDbConnection(strConn)) using (OleDbDataAdapter oda = new OleDbDataAdapter(query, cnnxls)) { oda.SelectCommand.Parameters.AddWithValue("@ProductID", productId); dtProductList.Clear(); // 先清空旧数据 oda.Fill(dtProductList); } } else { MessageBox.Show("未找到产品"); dtProductList.Clear(); // 清空GridView绑定的数据 }
方案2:同一个连接内完成检查与填充
如果你不想单独开一次连接执行COUNT查询,也可以在同一个连接会话里先做存在性检查,再决定是否填充数据:
int productId; if (!int.TryParse(txtProductId.Text, out productId)) { MessageBox.Show("请输入有效的产品ID"); return; } bool productExists = false; string fieldSelector = "[ProductID], [ProductName],[MRP]"; string query = $"SELECT {fieldSelector} FROM [{sheetName}$A1:Q15535] WHERE [ProductID] = ?"; using (OleDbConnection cnnxls = new OleDbConnection(strConn)) { cnnxls.Open(); // 先执行存在性检查,找到数据就返回1,否则返回null using (OleDbCommand checkCmd = new OleDbCommand($"SELECT 1 FROM [{sheetName}$A1:Q15535] WHERE [ProductID] = ?", cnnxls)) { checkCmd.Parameters.AddWithValue("@ProductID", productId); productExists = checkCmd.ExecuteScalar() != null; } if (productExists) { using (OleDbDataAdapter oda = new OleDbDataAdapter(query, cnnxls)) { oda.SelectCommand.Parameters.AddWithValue("@ProductID", productId); dtProductList.Clear(); oda.Fill(dtProductList); } } else { MessageBox.Show("未找到产品"); dtProductList.Clear(); } }
额外提示:避免SQL拼接风险
你原来的代码中直接把用户输入转换后拼到SQL里,虽然因为转成了int降低了风险,但还是建议坚持使用参数化查询(上面的示例都用到了),这是更安全、更规范的编码习惯,未来如果数据源换成数据库,能直接规避SQL注入风险。
内容的提问来源于stack exchange,提问作者I Love Stackoverflow
相关产品推荐
相关产品推荐

