【问题标题】:Excel with ACE Timeout in .NET using Data Adapter UpdateExcel 与 .NET 中的 ACE 超时使用数据适配器更新
【发布时间】:2012-10-13 20:29:26
【问题描述】:

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

提供程序似乎不支持连接超时属性。连接超时、超时、连接超时、连接超时等也不是。我的代码创建了一个数据适配器和 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 属性是只读的,并且提供程序似乎不支持连接字符串中的超时,该怎么办....

谢谢。

【问题讨论】:

  • 作为一个额外的东西,结帐 openxml,它在 Excel 工作表和非常大的 Excel 工作表中也能很好地工作

标签: c# excel ms-jet-ace oledbdataadapter


【解决方案1】:

这是我的想法:

  • 您实际上是在将其用作 appSetting 而不是 connectionStrings 吗?如果您将其用作连接字符串,请查看以下内容:Escape quote in web.config connection string
  • 数据源缺少它的值,只是指出它,因为您遗漏了那部分代码
  • 问题的根源可能是会话池超时设置:INFO: OLE DB Session Pooling Timeout Configuration
  • 您应该在您的连接、适配器和命令创建行周围放置 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();
    }
    

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2010-10-29
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多