使用Data Adapter Update在.NET中使用ACE超时的Excel

Bob*_*ser 6 c# excel oledbdataadapter ms-jet-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="/>
Run Code Online (Sandbox Code Playgroud)

提供程序似乎不支持"连接超时"属性.连接超时,超时,ConnectionTimeout,ConnectTimeout等都没有.我的代码创建了数据适配器和插入命令,以及数据集的更新.除非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();
Run Code Online (Sandbox Code Playgroud)

我省略了循环,实际上构建了insert命令的内容和参数.相信我,一切正常.2200+记录工作正常.

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

最重要的是,由于ConnectionTimeout属性是ReadOnly,并且提供程序似乎不支持连接字符串中的Timeout,该怎么做....

谢谢.

Lud*_*ton 1

这是我的想法:

  • 您实际上是否将其用作 appSetting 而不是 connectionStrings?如果您将其用作连接字符串,请查看以下内容:web.config 连接字符串中的转义引号
  • 数据源缺少其值,只是指出它,因为您遗漏了这部分代码
  • 问题的根源可能是会话池超时设置:信息: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();
    }
    
    Run Code Online (Sandbox Code Playgroud)