C# Winform遍历listBox批量插入SQL Server报错解决方案问询
问题根因
报错的核心原因是SqlCommand的参数集合没有在每次循环时清空:
- 第一次循环时给cmd添加了3个参数,执行正常
- 第二次循环时,又额外追加了3个参数,此时cmd里总共有6个参数,但存储过程
InsertSerial只定义了3个入参,自然抛出「参数过多」的错误。
修正方案
最优方案:预定义参数,循环内仅修改参数值
该方案性能最高,不需要反复新增/删除参数对象:
// save button private void snStoreBtn_Click(object sender, EventArgs e) { try { using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyApp.Properties.Settings.MyAppDatabaseString"].ConnectionString)) { if (cn.State == ConnectionState.Closed) cn.Open(); using (SqlCommand cmd = new SqlCommand("dbo.InsertSerial", cn)) { cmd.CommandType = CommandType.StoredProcedure; // 循环外预先定义所有参数 cmd.Parameters.Add("@ProductId", SqlDbType.Int); cmd.Parameters.Add("@Serial", SqlDbType.NVarChar, 50); cmd.Parameters.Add("@Sold", SqlDbType.Int).Value = 0; // 固定值直接提前赋值 foreach (var item in listBox1.Items) { // 循环内仅修改动态参数的值 cmd.Parameters["@ProductId"].Value = selectedProductId; cmd.Parameters["@Serial"].Value = item.ToString(); cmd.ExecuteNonQuery(); } // 无需手动关闭连接,using块会自动释放资源 } backgroundWorker1.RunWorkerAsync(); progressBarStoringData.Visible = true; progressLabel.Visible = true; } listBox1.Items.Clear(); } catch (SqlException ex) { StringBuilder errorMessages = new StringBuilder(); for (int i = 0; i < ex.Errors.Count; i++) { errorMessages.Append("Index #" + i + "\n" + "Message: " + ex.Errors[i].Message + "\n" + "LineNumber: " + ex.Errors[i].LineNumber + "\n" + "Source: " + ex.Errors[i].Source + "\n" + "Procedure: " + ex.Errors[i].Procedure + "\n"); } Console.WriteLine(errorMessages.ToString()); } }
可选方案:每次循环清空参数集合
如果不想预定义参数,也可以在每次循环开始时清空已有参数:
foreach (var item in listBox1.Items) { cmd.Parameters.Clear(); // 先清空上一次循环添加的参数 cmd.Parameters.AddWithValue("@ProductId", selectedProductId); cmd.Parameters.AddWithValue("@Serial", item.ToString()); cmd.Parameters.AddWithValue("@Sold", 0); cmd.ExecuteNonQuery(); }
额外优化提示
- 存储过程的
@Sold参数是INT类型,不要传字符串"0",直接传int值0避免隐式类型转换风险 - 表结构里
Sold字段是BIT类型,存储过程入参也可以改成BIT类型和表结构更匹配 - 不需要手动调用
cn.Close(),using块在代码执行完后会自动释放关闭数据库连接
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

