2010-09-27 5 views
0

Я использую следующий код, чтобы получить все записи данных из базы данных MS SQL, и я пытаюсь обновить каждую запись. Код используется в WebService. Проблема в том, что код работает нормально, если у меня 1000 записей данных, но теперь у меня есть 20000 записей данных, код сначала возвращается с таймаутом. Затем я установил cmd.CommandTimeout равным нулю, чтобы не было таймаута. Теперь, когда я вызываю функцию в IE WebSvc, окно IE остается пустым и все еще пытается загрузить что-то, но ничего не происходит. Обновляется только 150 datarecords.Восстановить и обновить 20000 записей данных перестает работать

У вас есть идеи, где проблема? Является ли код не лучшим, так что я должен изменить?

спасибо! 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

Не можете ли вы создать sqlconn2 вне цикла? – pascal

+0

Что делает 'CreateNewOrgBez'? Вам действительно нужно вернуть все это в свое приложение, а затем обновить его, агонизируя строку каждый в своей собственной транзакции? –

+0

Небольшое описание: функция получает полный набор сотрудников из базы данных и обновляет их название организации. Функции CreateNewOrgBez создают новое имя из существующего имени. Затем новое имя, которое находится в строках [] Массив, должно быть обновлено до полей WEB_OBEZ ... – 2010-09-27 16:43:20

ответ

0

Вы использовали два разных соединения для чтения и обновления, и один из них блокировал другой. Вот почему, когда вы сначала прочитали все свои данные, он начал работать.

0

Я сомневаюсь, если ваш нарваться OutOfMemoryException. Можете ли вы профилировать свое приложение и проверить использование памяти?

Поскольку вы просто переписываете переменные в цикле While, почему бы вам не попытаться вывести их из цикла.

2

Вы проскальзываете каждый SqlCommand здесь - я предлагаю вам рассмотреть ваше использование SqlClient классов, чтобы найти те, которые IDisposable и реструктурировать свой код, чтобы убедиться, что они всегда освобождены, используя using конструкции.

Например, это обеспечивает Dispose вызывается даже если есть исключение в квадратных скобках код:

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

Используя новый SqlConnection для каждого UPDATE дорого слишком, то это должно быть сделано вне цикла. Резервированное подключение, вероятно, объясняет ваш тайм-аут.

Обратите внимание на комментарий @ ck, что для эффективности этот тип поэтапной работы на стороне клиента не так хорош, как на стороне тяжелого подъема сервера. Вы должны иметь возможность улучшить этот код, но это не значит, что это идеальное/быстрое решение.

+0

Я изменил свою часть кода на вашу часть кода, но проблема все еще существует ...? – 2010-09-27 17:49:19

1

Я нашел проблему. Вам нужно сначала получить все записи данных, например, в новом DataTable. Используемая мной структура не работает, поскольку она считывает данные из базы данных, а также обновляет базу данных. После изменения его в новую структуру он работает.

Смежные вопросы