ASP.Net C#使用SQL参数触发NullReferenceException错误如何解决
问题根因
你的代码存在两个核心问题导致报错和功能异常:
- 初始代码执行顺序错误触发空引用异常:
你在仅执行SqlDataAdapter sda = new SqlDataAdapter()初始化后,没有给sda.SelectCommand属性赋值就直接访问sda.SelectCommand.Parameters,此时SelectCommand本身为null,自然触发空引用报错。而且你后续又重新给sda赋值了新的SqlDataAdapter实例,前面加的参数完全没有作用,整个执行逻辑是颠倒的。 - SQL参数用法不符合规则:
SQL参数的设计本身只支持传递查询值,不能用来代替列名、表名等SQL结构部分,你原本想通过@I动态传入查询列名的写法本身就不被ADO.NET支持,就算解决了空引用问题也无法得到正确的查询结果。
正确实现方案
你后续新增switch语句硬编码匹配列名的思路是完全正确的,既避免了SQL注入风险,又符合动态查询的需求,只需要调整代码执行顺序、补充必要的逻辑即可,完整代码如下:
try { // 1. 先生成动态查询SQL string qryselect = drpdSerType.SelectedValue?.ToString() ?? string.Empty; string cmdText = string.Empty; switch (qryselect) { case "Number": cmdText = "SELECT Number, Type, Qty, Date, RNum, ReceiptID FROM IssuedRN WHERE Number = @S"; break; case "RNum": cmdText = "SELECT Number, Type, Qty, Date, RNum, ReceiptID FROM IssuedRN WHERE RNum = @S"; break; case "ReceiptID": cmdText = "SELECT Number, Type, Qty, Date, RNum, ReceiptID FROM IssuedRN WHERE ReceiptID = @S"; break; default: // 兜底逻辑,避免下拉框值异常导致报错 throw new ArgumentException("无效的查询类型"); } // 2. 初始化数据库连接和适配器,使用using自动释放资源 using (SqlConnection con = new SqlConnection("Server=server1;Database=db1;Integrated Security=True")) using (SqlDataAdapter sda = new SqlDataAdapter(cmdText, con)) { // 3. 给参数赋值 sda.SelectCommand.Parameters.AddWithValue("@S", txtRNumSer.Text); // 4. 执行查询绑定 DataTable dt = new DataTable(); sda.Fill(dt); GridView1.DataSource = dt; GridView1.DataBind(); } } catch (Exception ex) { // 按需添加异常处理逻辑 }
补充注意事项
- 代码中新增了
?.和空值判断,避免极端情况下下拉框值为空触发的空引用问题 - 使用
using块包裹数据库相关对象,执行完毕后会自动释放资源,不需要手动关闭连接,避免资源泄漏 - switch的default分支可以根据你的业务需求调整,比如返回空数据或者提示用户查询类型错误
内容的提问来源于stack exchange,提问作者karl_009
相关产品推荐
相关产品推荐

