我使用以下代码从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;
}
}
答案 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)
您使用两个不同的连接来读取和更新,其中一个阻止了另一个。这就是为什么当你首先阅读所有数据时,它开始起作用了。