内循环中的ExecuteNonQuery

我正在尝试在C#中的循环中插入数据库记录。

它在我硬编码这样的值时起作用:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (222,333);"; SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); sqlConnection3.Open(); for (int i = 0; i < arrItemsPlanner.Length; i++) { try { cmd3.ExecuteNonQuery(); } catch { return "Error: Item could not be saved"; } finally { //Fail } } 

但是,当我使用参数化查询时,它不起作用 – 即使我将值硬编码到参数化查询中,如下所示:

  string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); sqlConnection3.Open(); for (int i = 0; i < arrItemsPlanner.Length; i++) { try { cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); cmd3.Parameters["@room_id"].Value = 222; cmd3.ExecuteNonQuery(); } catch { return "Error: Item could not be saved"; } finally { //Fail } } 

有人能看到我在哪里错了吗?

非常感谢!

看起来你一遍又一遍地添加命令的参数集合。 每次迭代都清除它。

我还建议抛出实际的exception,这样你就可以看到问题所在。

我告诉你一个简单的解决方案,并确保它有效。 如果在循环中使用参数您需要在执行查询后清除参数。 所以你可以使用它

 cmd3.executeNonQuery(); cmd3.parameters.clear(); 

这是未经测试的,但应作为替代方案。 只需添加一次并不断更新其值。

 .... cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); for (int i = 0; i < arrItemsPlanner.Length; i++) { try { cmd3.Parameters["@room_id"].Value = 222; cmd3.ExecuteNonQuery(); } .... 

SqlCommand一下,你的SqlCommand应该在一个using块和你的SqlConnection 。 完整的代码没有显示,所以我不知道您的连接是否实际上是这样完成的。

 using (var conn = new SqlConnection(...)) using (var cmd = new SqlCommand(..., conn)) { } 

你正在做的是添加一个参数ever循环迭代。 在下面的代码中,它添加了一次参数,只修改了单个参数的值。 试试这个:

 string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); cmd3.Parameters.Add("@room_id", SqlDbType.Int); sqlConnection3.Open(); for (int i = 0; i < arrItemsPlanner.Length; i++) { try { cmd3.Parameters["@room_id"].Value = 222; cmd3.ExecuteNonQuery(); } catch { return "Error: Item could not be saved"; } finally { //Fail } } 

是的,不要在循环中添加参数,只设置其值:

 string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); sqlConnection3.Open(); cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); for (int i = 0; i < arrItemsPlanner.Length; i++) { try { cmd3.Parameters["@room_id"].Value = 222; cmd3.ExecuteNonQuery(); } catch { return "Error: Item could not be saved"; } finally { //Fail } } 
 cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int); 

//不要继续在循环中添加它

 cmd3.Parameters["room_id"].Value = 222; 

在使用sql server的参数集合中没有@needed

对于那些正在寻找这个线程的人来说,另一个解 创建两个连接。 一个用于循环,另一个用于发送NonQuery语句。 这对我有用。