Недопустимая попытка вызова Read при закрытой ошибке чтения при вызове метода ExecuteScalar

У меня есть приложение ASP.NET, которому нужно загрузить данные из файла excel. Файл содержит около 20 тысяч записей. Приложение считывает данные из файла и перебирает каждую запись, выполняет вычисления и проверки, а затем вставляет каждую запись в БД. Все работает так, как ожидалось, пока метод Insert не выдаст исключение. Ошибка вылетает через 10-11 минут работы. Примечание. Весь процесс загрузки выполняется в области действия транзакции, которая определяется следующим образом:

 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))

Все время открывается SQLConnection - я гарантирую это с помощью SQL Profiler. Для работы с БД мы используем объект Microsoft.Practices.EnterpriseLibrary.Data.Database. Это метод вставки:

public bool InsertInspectionRide(InspectionRideBE be)
    {
        bool result = false;
        try
        {
            using (System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("InsertInspectionRide",
                be.param1, be.param2))
            {

                cmd.CommandTimeout = 60000000;


                be.IdRide = Convert.ToInt32(db.ExecuteScalar(cmd));

                result = be.IdRide > 0;
            }
        }
        catch (Exception ex)
        {
            if (ExceptionPolicy.HandleException(ex, "DAL"))
            {
                throw;
            }
        }
        return result;
    }

Это ошибка:

    06/28/2016 10:27:14
Type : System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : 
Source : 
Help link : 
Data : System.Collections.ListDictionaryInternal
TargetSite : 
Stack Trace : The stack trace is unavailable.
Additional Info:

MachineName : XXX
TimeStamp : 6/28/2016 7:27:14 AM
FullName : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
AppDomainName : /XXX-1-131115702788886173
ThreadIdentity : XXX
WindowsIdentity : XXXX
    Inner Exception
    ---------------
    Type : System.InvalidOperationException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
    Message : Invalid attempt to call Read when reader is closed.
    Source : System.Data
    Help link : 
    Data : System.Collections.ListDictionaryInternal
    TargetSite : Boolean ReadInternal(Boolean)
    Stack Trace :    at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
       at System.Data.SqlClient.SqlDataReader.Read()
       at System.Data.SqlClient.SqlCommand.CompleteExecuteScalar(SqlDataReader ds, Boolean returnSqlValue)
       at System.Data.SqlClient.SqlCommand.ExecuteScalar()
       at Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteScalar(IDbCommand command)
       at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteScalar(DbCommand command)
       at EnforcementService.DataAccess.InspectionRideDAL.InsertInspectionRide(InspectionRideBE be)

У меня есть поиск информации об этой ошибке, и основная идея заключается в том, что соединение закрыто, но я не могу понять, почему?

Буду признателен за любую помощь или совет


person Lev Z    schedule 28.06.2016    source источник
comment
Добавьте Debug.Print(myConn.State). Вы обнаружите, что соединение закрыто. Теперь проследите в обратном направлении. этот кусок кода, вероятно, невиновен.   -  person usr    schedule 03.07.2016
comment
Привет! Я понимаю, что в момент возникновения исключения соединение закрывается. Мне нужно понять причину закрытия. Спасибо   -  person Lev Z    schedule 03.07.2016


Ответы (1)


Хорошо, я нашел источник проблемы. Это тайм-аут транзакции. System.Transaction имеет свойство MaxTimeout, и его значение по умолчанию равно 10 минутам. Используя код или конфигурацию приложения/веб-сайта, вы можете только уменьшить его значение. Чтобы увеличить его, вы должны настроить его в файле machine.config, добавив следующий блок в раздел END файла конфигурации.

<system.transactions>
 <machineSettings maxTimeout="01:00:00" />
</system.transactions>
</configuration> 

Вот несколько соответствующих статей: Переопределите тайм-аут System.Transactions по умолчанию, равный 10 минутам, в коде.

значение maxTimeout из машины .Config не подхватывается приложением C# winform

person Lev Z    schedule 04.07.2016