6

我在将数据从数据集写入 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="/>

提供程序似乎不支持 Connect Timeout 属性。Connection Timeout、Timeout、ConnectionTimeout、ConnectTimeout 等也不是。我的代码创建了一个 Data Adapter 和 InsertCommand,并从数据集进行更新。除非更新命令本身花费超过 15 秒(这是默认的 OleDb 超时),否则这非常有效。这就是为什么我试图在连接字符串中设置它。我已经从默认的 30 增加了 CommandTimeout,但这真的无关紧要。以下是我的代码:

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

我省略了实际构建插入命令的内容和参数的循环等。相信我,一切正常。2200+ 条记录工作正常。

在我添加计时器之后,我发现问题是超时。处理 2221 条记录时,需要 14.95 秒,并且在电子表格中显示得很好。处理 2260 条记录时,需要 15.21 秒,但没有任何显示。没有任何错误。我检查了所有行更新后的行状态,它们都没有显示失败。

底线,由于 ConnectionTimeout 属性是只读的,并且提供程序似乎不支持连接字符串中的超时,该怎么办....

谢谢。

4

2 回答 2

1

以下是我的想法:

  • 您实际上是将其用作 appSetting 而不是 connectionStrings 吗?如果您将其用作连接字符串,请查看:Escape quote in web.config connection string
  • 数据源缺少它的值,只是指出它是因为您遗漏了那部分代码
  • 您的问题的根源可能是您的会话池超时设置:信息:OLE DB 会话池超时配置
  • 您应该在连接、适配器和命令创建行周围放置 using 语句,不这样做会创建一种蒸汽锁形式并强制超时。
  • 您确定这是超时而不是“电子表格已满”错误吗?这是我的代码,它在 ~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();
    }
    
于 2012-10-25T17:39:53.983 回答
-2

将应用程序池帐户设置为“LocalSystem”或机器管理员

于 2015-07-21T19:03:16.420 回答