循环中的ExecuteNonQuery

10

我正在尝试在 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
            }
        }

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

非常感谢!

7个回答

7

经过测试的简单解决方案。 如果您在循环中使用参数,执行查询后需要清除参数。 因此,您可以使用以下代码:

cmd3.executeNonQuery();
cmd3.Parameters.Clear();

7

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

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


谢谢 - 我已经为此苦思冥想很长时间了! 对你们来说只需几秒钟就能弄清楚。 非常感谢大家。 - Dan
@Dan - 没问题!顺便说一句,我建议你更新你的代码,使用using语句来正确处理资源释放(正如Austin Salonen的帖子所建议的那样)。 - Tim M.

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))
{

}

1
你正在做的是在每个循环迭代中添加一个参数。在下面的代码中,它只添加了一次参数,并且只修改了单个参数的值。请尝试这样做:
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 
        } 
    } 

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
        }
    }

1
cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int);

// 不要在循环中不断添加它

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

在使用SQL Server时,参数集合中不需要 @needed


0

对于那些正在查看此线程的人,另一个解决方案是创建两个连接。一个用于循环,另一个用于发送非查询语句。这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接