我正在尝试在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
}
}
谁能看到我在哪里出错?
非常感谢!
答案 0 :(得分:6)
我告诉你一个简单的解决方案&amp;肯定是有效的。 如果在循环中使用参数您需要在执行查询后清除参数。 所以你可以使用那个
cmd3.executeNonQuery();
cmd3.parameters.clear();
答案 1 :(得分:5)
看起来你一遍又一遍地添加命令的参数集合。每次迭代都清除它。
我还建议抛出实际的异常,这样你就可以看到问题所在。
答案 2 :(得分:3)
这是未经测试但应该作为替代方案。只需添加一次并不断更新其值。
....
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
应该在using
区块以及SqlConnection
区域内。没有显示完整的代码,因此我不知道您的连接是否实际上是以这种方式完成的。
using (var conn = new SqlConnection(...))
using (var cmd = new SqlCommand(..., conn))
{
}
答案 3 :(得分:1)
您正在做的是添加一个参数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
}
}
答案 4 :(得分:1)
是的,不要在循环中添加参数,只设置其值:
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
}
}
答案 5 :(得分:1)
cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int);
//不要继续将它添加到循环中
cmd3.Parameters["room_id"].Value = 222;
在使用sql server的参数集合中没有@needed
答案 6 :(得分:0)
正在寻找此主题的人的另一个解决方案。创建两个连接。一个用于循环,另一个用于发送NonQuery语句。这对我有用。