控制台程序数据库插入报错Error Number:134,State:1,Class:15求助
解决控制台应用循环插入数据库的参数重复问题
我之前在控制台应用里开发数据生成并插入数据库的功能,一开始单行数据插入完全正常,但放到while循环里批量生成插入时就遇到了参数冲突的问题。
问题场景还原
最开始的代码大概是这样的(模拟我的实现逻辑):
using (var conn = new SqlConnection(connectionString)) { conn.Open(); var cmd = new SqlCommand("INSERT INTO MyTable (Col1, Col2) VALUES (@Col1, @Col2)", conn); int count = 0; while (count < 10) { // 生成随机数据 var col1Value = $"Data_{count}"; var col2Value = count * 10; // 直接添加参数 cmd.Parameters.AddWithValue("@Col1", col1Value); cmd.Parameters.AddWithValue("@Col2", col2Value); // 执行插入 cmd.ExecuteNonQuery(); count++; } }
这段代码运行时会抛出参数重复的异常——因为每次循环都往cmd.Parameters集合里追加新参数,导致同一个参数名被重复添加,数据库无法识别。
最终解决方法
后来我尝试在每次循环开始前清空参数集合,用cmd.Parameters.Clear()方法完美解决了问题:
using (var conn = new SqlConnection(connectionString)) { conn.Open(); var cmd = new SqlCommand("INSERT INTO MyTable (Col1, Col2) VALUES (@Col1, @Col2)", conn); int count = 0; while (count < 10) { // 关键步骤:每次循环先清空参数集合 cmd.Parameters.Clear(); // 生成随机数据 var col1Value = $"Data_{count}"; var col2Value = count * 10; // 添加参数 cmd.Parameters.AddWithValue("@Col1", col1Value); cmd.Parameters.AddWithValue("@Col2", col2Value); // 执行插入 cmd.ExecuteNonQuery(); count++; } }
这样每次循环都会重置参数集合,不会出现重复参数的问题,批量插入功能完全正常运行了。
额外优化方案
如果追求更高的性能,还可以预先定义好参数,每次循环只更新参数的值,避免反复清空和创建参数的开销:
using (var conn = new SqlConnection(connectionString)) { conn.Open(); var cmd = new SqlCommand("INSERT INTO MyTable (Col1, Col2) VALUES (@Col1, @Col2)", conn); // 预先定义参数类型和名称 cmd.Parameters.Add("@Col1", SqlDbType.VarChar, 50); cmd.Parameters.Add("@Col2", SqlDbType.Int); int count = 0; while (count < 10) { // 直接更新参数值 cmd.Parameters["@Col1"].Value = $"Data_{count}"; cmd.Parameters["@Col2"].Value = count * 10; // 执行插入 cmd.ExecuteNonQuery(); count++; } }
这种方式减少了参数对象的频繁创建和销毁,在大批量数据插入时能提升不少效率。
内容的提问来源于stack exchange,提问作者Valentin Kohler
相关产品推荐
相关产品推荐

