2015-06-25 2 views
0

у меня это C# код:«Существует уже открытая DataReader, связанные с этим соединением» ошибка

using (SqlConnection db = Database.Connection) 
{ 
    db.Open(); 
    string selectString = "SELECT id, numwave, CAST(kol_fakt AS int) AS kol_fakt FROM sorters WHERE [email protected] AND [email protected] AND  [email protected]"; 
    try 
    { 
     SqlCommand command = new SqlCommand(selectString, db); 
     command.Parameters.AddWithValue("@numDoc", numDoc); 
     command.Parameters.AddWithValue("@kodProd", kodProd); 
     command.Parameters.AddWithValue("@numPal", numPal); 
     SqlDataReader reader = command.ExecuteReader(); 
     while (reader.Read() && reduseLeft > 0) 
     { 
      FUid = ""; 
      FUnumwave = ""; 
      FUkolfakt = 0; 

      FUid = reader["id"].ToString(); 
      FUnumwave = reader["numwave"].ToString(); 
      FUkolfakt = (int)reader["kol_fakt"]; 
      if (FUkolfakt >= reduseLeft) 
      { 
       string updateString = "UPDATE sorters SET [email protected] WHERE [email protected] AND id=[email protected]"; 
       try 
       { 
        SqlCommand upCommand = new SqlCommand(updateString, db); 
        upCommand.Parameters.AddWithValue("kol_fakt", (FUkolfakt - reduseLeft).ToString()); 
        upCommand.ExecuteNonQuery();//HERE ERROR 
        reduseLeft = 0; 
       } 
       catch (Exception ex) 
       { 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
    } 
    db.Close(); 
} 

Я получил сообщение об ошибке:

Там уже находится открытая DataReader, связанные с этим Соединение или команда, которые должны быть закрыты первыми.

Мне нужно создать SqlCommand в SqlCommand, как я могу это сделать?

ответ

4

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

SqlCommand upCommand = new SqlCommand(updateString, db); 
upCommand.Parameters.AddWithValue("kol_fakt", (FUkolfakt - reduseLeft).ToString()); 
upCommand.ExecuteNonQuery();//HERE ERROR 
reduseLeft = 0; 

Хотя, лучше реорганизовать свой код так, что вам не нужно открывать новое соединение в то же время чтения из предыдущего соединения.

+0

Благодарим за помощь) – Roman

3

Чтобы сделать то, что вы хотите, вы должны либо открыть второе соединение с базой данных (вы действительно не должны поддерживать соединения живыми, просто откройте их по мере необходимости. NET будет использовать Connection Pooling для повторного использования подключений для сокращения ресурсов) или включить «Multiple Active Result Sets» в строке подключения, которую вы использовали для создания соединения в Database.Connection

0

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

если записей слишком много, чтобы вписаться в память. попробуйте открыть новое соединение для SqlCommnad. и переместите SqlCommand из цикла while и вызовите метод Prepare.

Если возможно, вам лучше использовать хранимую процедуру.

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