【问题标题】:Retrieve & update 20000 data records stops working检索和更新 20000 条数据记录停止工作
【发布时间】:2011-04-17 19:56:28
【问题描述】:

我正在使用以下代码从 MS SQL 数据库中获取所有数据记录,并尝试更新每条记录。该代码用于 WebService。问题是,如果我有 1000 条数据记录,代码运行良好,但现在我有 20000 条数据记录,并且代码首先返回超时。然后我将 cmd.CommandTimeout 设置为零以没有超时。现在,当我在 IE WebSvc 中调用该函数时,IE 窗口仍然是空白的,并且仍然尝试加载某些内容,但没有任何反应。仅更新了 150 条数据记录。

您知道问题可能出在哪里吗?代码不是最好的,那我应该改什么?

非常感谢! 世嘉

我的代码:

 private string AddNewOrgBez()
        {
            try
            {
                SqlConnection sqlconn = new SqlConnection(this.connectionString);
                SqlCommand cmd;
                SqlDataReader reader;
                sqlconn.Open();

                cmd = new SqlCommand("SELECT * FROM dbo.mydata", sqlconn);
                cmd.CommandTimeout = 0;
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    // Felder holen
                    string okuerzel = reader["O_KURZ"].ToString();
                    string bezeichnung = reader["O_BEZ"].ToString();

                    string[] lines = CreateNewOrgBez(bezeichnung);

                    string sqlcmd = "UPDATE dbo.mydata SET WEB_OBEZ1 = '" + lines[0] + "', WEB_OBEZ2 = '" + lines[1] + "', WEB_OBEZ3 = '" + lines[2] + "' WHERE O_KURZ = '" + okuerzel + "'";

                    SqlConnection sqlconn2 = new SqlConnection(this.connectionString);
                    sqlconn2.Open();
                    SqlCommand cmd2 = new SqlCommand(sqlcmd, sqlconn2);
                    cmd2.CommandTimeout = 0;
                    cmd2.ExecuteNonQuery();
                    sqlconn2.Close();
                }

                reader.Close();
                sqlconn.Close();

                return "OK";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

【问题讨论】:

  • 不能在循环外创建 sqlconn2 吗?
  • CreateNewOrgBez 是做什么的?您真的必须将所有这些都带回您的应用程序,然后通过在自己的事务中处理每个行来更新它吗?
  • 一点说明:该函数从数据库中获取一整套员工并更新他们的组织名称。 CreateNewOrgBez 函数根据现有名称创建新名称。然后将 lines[] 数组中的新名称更新为 WEB_OBEZ 字段...

标签: c# sql-server select


【解决方案1】:

我怀疑你是否遇到OutOfMemoryException。您可以分析您的应用程序并检查内存使用情况吗?

既然你只是覆盖While循环中的变量,你为什么不试着把它们从循环中取出来。

【讨论】:

    【解决方案2】:

    您在这里泄漏了每个SqlCommand - 我建议您检查您对SqlClient 类的使用以找到IDisposable 并重组您的代码以确保它们始终被释放,使用using 构造。

    例如,即使括号中的代码中有异常,这也可以确保调用Dispose

    using (SqlCommand cmd2 = new SqlCommand(sqlcmd, sqlconn2))
    {
      cmd2.CommandTimeout = 0;
      cmd2.ExecuteNonQuery();
    }
    

    为每个 UPDATE 使用新的 SqlConnection 也很昂贵,这应该在循环之外完成。冗余连接建立可能是您超时的原因。

    请注意@ck 的评论,为了提高效率,这种零散的客户端操作不如繁重的服务器端操作。您应该能够让这段代码更好地工作,但这并不意味着它是理想/最快的解决方案。

    【讨论】:

    • 我将代码部分更改为您的代码部分,但问题仍然存在...?
    【解决方案3】:

    我发现了问题。 您首先需要获取所有数据记录,例如在一个新的 DataTable 中。我使用的结构不起作用,因为它从数据库中读取数据并更新数据库。将其更改为新结构后,它就可以工作了。

    【讨论】:

      【解决方案4】:

      您正在使用两个不同的连接来读取和更新,其中一个正在阻止另一个。这就是为什么当您首先读取所有数据时,它就开始起作用了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        相关资源
        最近更新 更多