检索&更新20000数据记录停止工作

时间:2010-09-27 14:59:07

标签: c# sql-server select

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

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

非常感谢! WorldSignia

mycode的:

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

4 个答案:

答案 0 :(得分:2)

您在此处SqlCommand每次泄漏一次 - 建议您查看使用SqlClient类来查找IDisposable类并重新构建代码以确保它们始终被释放, using构造。

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

由于您只是在While循环中覆盖变量,为什么不尝试将它们从循环中取出。

答案 3 :(得分:0)

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