循环内部的ExecuteNonQuery
本文关键字:ExecuteNonQuery 内部 循环 | 更新日期: 2023-09-27 18:19:44
我正试图在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
}
}
有人能看到我哪里错了吗?
非常感谢!
看起来您正在一次又一次地添加到命令的参数集合中。每次迭代都要清除它。
我还建议抛出实际的异常,这样您就可以看到问题所在。
已测试&简单的解决方案。如果您在循环中使用参数,则需要在执行查询后清除这些参数。所以你可以使用
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
应该和SqlConnection
一样位于using
块内。完整的代码没有显示,所以我不知道你的连接是否真的是这样完成的。
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 的参数集合中不需要@
另一个适用于关注此线程的解决方案。创建两个连接。一个用于循环,另一个用于发送NonQuery语句。这对我很有效。