2012-10-23 11 views
6

Si verifica un problema di timeout durante la scrittura di dati da un set di dati in un foglio di calcolo Excel. Attualmente la stringa di connessione è la seguente:Excel con timeout ACE in .NET tramite Aggiornamento scheda dati

<add key="ExcelConnectionStringHeader" value="Provider=Microsoft.ACE.OLEDB.12.0;Connect Timeout=30;Extended Properties=&quot;Excel 12.0;HDR=YES&quot;;Data Source="/> 

La proprietà Connect Timeout non sembra essere supportata dal provider. Nessu- na Timeout connessione, Timeout, ConnectionTimeout, ConnectTimeout, ecc. Il mio codice ha creato una scheda dati e InsertCommand e aggiornamenti da un set di dati. Funziona alla grande, a meno che il comando Update stesso richieda più di 15 secondi, che è il timeout OleDb predefinito. Ecco perché sto cercando di impostarlo nella stringa di connessione. Ho aumentato CommandTimeout dal valore predefinito di 30, ma questo è davvero irrilevante. Di seguito è riportato il mio codice:

 OleDbDataAdapter da = new OleDbDataAdapter(szHeaderSelect, oCnn); // Ratings_Test -- Loan_Test$A1:F1]", 
     DataSet dsTest = new DataSet(); 

     da.InsertCommand = new OleDbCommand(szNewSQL + "(" + szColumns + ") " + "VALUES (" + szParams + ")", oCnn); 
     da.InsertCommand.CommandTimeout = 300; 


     foreach (DataRow oDr in dtTable.Rows) 
     { 

      drNew = dsTest.Tables[0].NewRow(); 

      dsTest.Tables[0].Rows.Add(drNew); 
     } 

     var timer = new System.Diagnostics.Stopwatch(); 
     timer.Start(); 
     var recs = da.Update(dsTest, szExcelTab); // Ratings_Test   } 
     timer.Stop(); 

Ho omesso i loop e tale che effettivamente costruisco il contenuto e i parametri del comando di inserimento. Fidati di me, tutto funziona bene. 2200+ record funzionano bene.

E 'stato dopo aver aggiunto il timer che ho scoperto che il problema era il timeout. Durante l'elaborazione di 2221 record, ci vogliono 14,95 secondi e si presenta bene nel foglio di calcolo. Durante l'elaborazione di 2260 record, ci vogliono 15.21 secondi e non compare nulla. Non ci sono errori di alcun tipo. Ho controllato lo stato della riga dopo l'aggiornamento per tutte le righe e non mostrano alcun errore.

Linea di fondo, dal momento che la proprietà ConnectionTimeout è di sola lettura, e il provider non sembra sostenere un timeout nella stringa di connessione, cosa fare ....

Grazie.

+0

Proprio come una cosa in più, verifica openxml, funziona molto bene con i fogli Excel anche con fogli Excel molto grandi – kunjee

risposta

1

Qui sono le mie idee:

  • Stai in realtà utilizza questo come un appSetting e non un connectionStrings? Se lo si utilizza come un connectionStrings controllare questo: Escape quote in web.config connection string
  • Data Source manca il suo valore, basta segnalarlo, perché hai lasciato che parte del codice
  • La causa del problema potrebbe essere la vostra timeout pool Session impostazioni: INFO: OLE DB Session Pooling Timeout Configuration
  • È necessario inserire le istruzioni attorno alla connessione, all'adattatore e alle linee di creazione del comando, in caso contrario non è possibile creare una maschera di blocco del vapore e forzare un timeout.
  • Sei sicuro che sia un timeout e non un errore "Spreadsheet Full"? Ecco il mio codice che viene completato dopo ~ 1: 50, se lo rilanci fino a 4.000.000 di righe ottieni "Il foglio di calcolo è pieno". errore dopo ~ 4: 50:

    static void Main(string[] args) 
    { 
        var timer = new System.Diagnostics.Stopwatch(); 
    
        try 
        { 
         string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=\"Excel 12.0;HDR=YES;\";Data Source=Book1.xlsx"; 
    
         using (OleDbConnection oleDbConnection = new OleDbConnection(connectionString)) 
         { 
          oleDbConnection.Open(); 
    
          string szHeaderSelect = "SELECT [A1] FROM from [Sheet1$]"; 
          using (OleDbDataAdapter da = new OleDbDataAdapter(szHeaderSelect, oleDbConnection)) 
          { 
           using (da.InsertCommand = new OleDbCommand("INSERT INTO [Sheet1$] ([A1]) VALUES (?)", 
            oleDbConnection)) 
           { 
            da.InsertCommand.Parameters.Add("A1", OleDbType.Integer, 20, "[A1]"); 
    
            List<int> testData = new List<int>(); 
            for (int i = 1; i < 400000; i++) 
            { 
             testData.Add(i); 
            } 
    
            DataSet dsTest = new DataSet(); 
            dsTest.Tables.Add("[Sheet1$]"); 
            dsTest.Tables[0].Columns.Add("[A1]"); 
    
            foreach (int number in testData) 
            { 
             DataRow drNew = dsTest.Tables[0].NewRow(); 
             drNew["[A1]"] = number; 
    
             dsTest.Tables[0].Rows.Add(drNew); 
            } 
    
            timer.Start(); 
            var recs = da.Update(dsTest, "[Sheet1$]"); 
           } 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.Out.WriteLine(ex.Message); 
        } 
        finally 
        { 
         timer.Stop(); 
    
         Console.WriteLine(timer.Elapsed); 
        } 
    
        // Don't close before I get to read the results 
        Console.WriteLine(); 
        Console.WriteLine("Press Enter to quit."); 
        Console.ReadLine(); 
    }