2012-10-23 17 views
6

我遇到了將數據集中的數據寫入Excel電子表格的超時問題。以下是我的連接字符串:使用數據適配器更新在.NET中使用ACE超時Excel

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

連接超時屬性似乎不被提供程序支持。 Connection Timeout,Timeout,ConnectionTimeout,ConnectTimeout等都沒有。我的代碼創建了一個Data Adapter和InsertCommand,並從數據集中進行更新。這很有效,除非Update命令本身超過15秒,這是默認的OleDb超時。這就是爲什麼我試圖在連接字符串中設置它。我已經將CommandTimeout從30的默認值增加了,但這是非常不相關的。以下是我的代碼:

 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(); 

我省略了循環,並且實際上構建了insert命令的內容和參數。相信我,它一切正常。 2200+記錄工作正常。

這是我添加計時器後,我發現問題是超時。處理2221條記錄時,需要14.95秒,並且在電子表格中顯示得很好。處理2260條記錄時,需要15.21秒,沒有任何顯示。沒有任何錯誤。我已經檢查了所有行更新後的行狀態,它們都沒有顯示任何故障。

底線,因爲ConnectionTimeout屬性是隻讀的,而供應商似乎並不支持連接字符串,做什麼在超時....

感謝。

+0

就像一個額外的事情,結帳openxml,它與Excel表格也非常漂亮,還有非常大的Excel表格 – kunjee

回答

1

這裏是我的想法:

  • 你實際使用此作爲appSetting,而不是一個的ConnectionStrings?如果您正在使用它作爲一個的ConnectionStrings看看這個:Escape quote in web.config connection string
  • 數據源缺少它的價值,只是指點一下,因爲你離開了代碼
  • 你的問題的根源的那部分可能是你的會話池超時設置:INFO: OLE DB Session Pooling Timeout Configuration
  • 你應該在你的連接,適配器和命令創建線上使用語句,而不是這樣做可以創建一個鎖定形式並強制超時。
  • 您確定它是一個超時而不是「電子表格已滿」的錯誤嗎?這裏是我的代碼在〜1:50之後完成,如果你將它撞到4,000,000行,你會得到「電子表格已滿」。錯誤後〜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(); 
    } 
    
相關問題