Excel中使用数据适配器更新.NET中的ACE超时

我遇到了将数据集中的数据写入Excel电子表格的超时问题。 这是我的连接string目前:

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

Connect Timeout属性似乎不被提供者支持。 Connection Timeout,Timeout,ConnectionTimeout,ConnectTimeout等都没有。我的代码创build了一个Data Adapter和InsertCommand,并从数据集中进行更新。 这很好,除非Update命令本身超过15秒,这是默认的OleDb超时。 这就是为什么我试图设置它在连接string。 我已经将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(); 

我省略了循环,并且实际上构build了插入命令的内容和参数。 相信我,这一切工作正常。 2200+logging工作正常。

在我添加计时器之后,我发现问题已经超时。 处理2221条logging时,需要14.95秒,并在电子表格中显示正常。 处理2260条logging时,需要15.21秒,没有任何显示。 没有任何错误。 我已经检查所有行更新后的行状态,他们都显示没有失败。

底线,因为ConnectionTimeout属性是ReadOnly,并且提供程序似乎不支持连接string中的超时,该怎么办….

谢谢。

这是我的想法:

  • 你真的使用这个appSetting而不是connectionStrings? 如果你使用它作为connectionStrings检查这个: 在web.config连接string中的转义引号
  • 数据源缺less它的价值,只是指出了,因为你遗漏了那部分代码
  • 问题的根源可能是您的会话池超时设置: INFO:OLE DB会话池超时configuration
  • 你应该在你的连接,适配器和命令创build线上使用语句,而不是这样做可以创build一个lockingforms并强制超时。
  • 你确定这是一个超时,而不是一个“电子表格已满”的错误? 这是我的代码在〜1:50之后完成,如果你碰到400万行,你会得到“电子表格已满”。 〜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(); } 

将应用程序池帐户设置为“本地系统”或机器pipe理员 。