2016-06-28 3 views
0

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

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) 

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

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

+0

Добавить 'Debug.Print (myConn.State)'. Вы увидите, что соединение закрыто. Теперь проследите назад. этот кусок кода, вероятно, невиновен. – usr

+0

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

ответ

0

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

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

Вот некоторые соответствующие статьи: Override the System.Transactions default timeout of 10 minutes in the code.

maxTimeout value from Machine.Config is not picked up by C# winform app