【问题标题】:Inserting a List of Data results in a connection error插入数据列表导致连接错误
【发布时间】:2022-11-29 12:00:56
【问题描述】:

我正在尝试使用循环将数据对象列表输入到我的表中。但是在循环期间,逻辑突然停止并出现此错误:

已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。

这是我的代码:

List<TransactionAccount> accounts = new List<TransactionAccount>();

try
   {
        using (con = new SqlConnection(connectionString))
        {
            string query = "INSERT INTO Accounts (name, category) VALUES (@name, @category)";
            cmd = new SqlCommand(query, con);
            con.Open();
    
            foreach (TransactionAccount account in accounts)
            {
                cmd.Parameters.AddWithValue("@name", account.name);
                cmd.Parameters.AddWithValue("@category", account.category);
                int exec = cmd.ExecuteNonQuery();
            }
    
            con.Close();
        }
    }
    catch (Exception ex)
    {
                    
    }

该错误没有意义,因为我在循环结束时关闭了连接。我应该在这里改变什么?

【问题讨论】:

  • 你什么时候看到这个错误?在 foreach 循环内?或者在 foreach 循环期间?在错误之前循环迭代了多少次?
  • 错误消息清楚地表明数据阅读器是开放的并引起力的干扰,这可能意味着一个在其他地方是开放的。 AddWithValue 无法在循环中正常工作。空捕获也是一个坏主意
  • cmd 在哪里以及如何声明?

标签: c# sql-server


【解决方案1】:

我建议与其一次又一次地调用查询,不如传递一个表变量。它将保存对数据库查询的多次调用。并将提高代码的性能。

您可以编写一个将表变量作为参数的存储过程。

在存储过程中,您可以为此表变量运行一个循环并插入记录。

回到您最初的问题,我怀疑您已将 cmd 声明为班级成员,并在导致问题的多个查询中使用它。你应该在你的方法中声明它。

请避免AddWithValue你可以使用Parameters.Add,Here是为什么?

另外,请利用 ExecuteNonQuery 的返回值来记录它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多