2016-06-28 9 views
0

Ich habe eine ASP.NET-Anwendung, die Daten für die Excel-Datei laden muss. Die Datei enthält ca. 20K Datensätze. Die App liest die Daten aus der Datei und durchläuft jeden Datensatz, führt Berechnungen und Validierungen durch und fügt dann jeden Datensatz in eine Datenbank ein. Alles funktioniert wie erwartet, bis die Insert-Methode die Ausnahme auslöst. Der Fehler wird nach 10 - 11 Minuten Laufzeit ausgelöst. Hinweis: Alle Ladevorgang läuft in einen Transaktionsbereich, die in der folgenden Weise definiert:Ungültiger Versuch, Read aufzurufen, wenn der Reader geschlossen ist Fehler beim Aufruf der ExecuteScalar-Methode

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

Die ganze Zeit SQLConnection- geöffnet wird - ich habe dies sicherzustellen einen SQL Profiler. Um mit DB zu arbeiten verwenden wir ein Microsoft.Practices.EnterpriseLibrary.Data.Database Objekt. Diese ist ein Insert-Methode:

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; 
    } 

Dies ist ein Fehler:

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) 

Ich suche haben Informationen über diesen Fehler und die Hauptidee ist, dass die Verbindung geschlossen ist, aber ich kann nicht verstehen Warum?

ich Hilfe oder Ratschläge

+0

Add 'Debug.Print (myConn.State)'. Sie werden feststellen, dass die Verbindung geschlossen ist. Jetzt zurückverfolgen. Dieses Stück Code ist wahrscheinlich unschuldig. – usr

+0

Hallo! Ich verstehe, dass im Moment, in dem die Ausnahme ausgelöst wird, die Verbindung geschlossen ist. Ich muss den Grund des Schließens verstehen. Vielen Dank –

Antwort

0

Ok, haben zu schätzen wissen würde ich die Ursache des Problems gefunden. Es ist ein Transaktions-Timeout. System.Transaction hat die MaxTimeout-Eigenschaft und der Standardwert beträgt 10 Minuten. Mit dem Code oder der App/Web Config können Sie nur den Wert reduzieren. Um es zu erhöhen, müssen Sie es in der machine.config-Datei konfigurieren, indem Sie folgenden Block im END des Konfigurationsabschnitts der Datei hinzufügen.

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

Hier sind einige relevante Artikel: 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