C#执行Count(*)查询时报参数dataTable不能为null错误如何解决
报错Value can not be null parameter name dataTable的核心原因是代码中传入sdr.Fill()方法的dt对象(DataTable类型)未完成实例化,处于null状态。
解决方式1:补充DataTable实例化逻辑
在调用Fill方法前先实例化dt,如果dt是当前窗体的全局变量,可以在声明时直接初始化,也可以在List_Load事件中执行Fill操作前初始化,修正后代码如下:
private void List_Load(object sender, EventArgs e) { try { // 实例化DataTable,避免传入null DataTable dt = new DataTable(); if (Sqlcon.State == ConnectionState.Closed) { Sqlcon.Open(); } string query = "Select Count(*) from AddCars "; SqlDataAdapter sdr = new SqlDataAdapter(query, Sqlcon); sdr.Fill(dt); totaltbl.Text = dt.Rows[0][0].ToString(); } catch (Exception ex) { MessageBox.Show("Error" + ex); } finally { // 额外建议:用完数据库连接及时关闭,避免连接泄漏 if (Sqlcon.State == ConnectionState.Open) { Sqlcon.Close(); } } }
解决方式2:改用更适配单值查询的ExecuteScalar方法
当前场景是查询单个统计结果,不需要加载整个DataTable,用ExecuteScalar性能更好,代码也更简洁:
private void List_Load(object sender, EventArgs e) { try { if (Sqlcon.State == ConnectionState.Closed) { Sqlcon.Open(); } string query = "Select Count(*) from AddCars "; SqlCommand cmd = new SqlCommand(query, Sqlcon); // 直接获取统计结果,无需DataAdapter和DataTable totaltbl.Text = cmd.ExecuteScalar().ToString(); } catch (Exception ex) { MessageBox.Show("Error" + ex); } finally { if (Sqlcon.State == ConnectionState.Open) { Sqlcon.Close(); } } }
内容的提问来源于stack exchange,提问作者Noman Hassan
相关产品推荐
相关产品推荐

