Excel с тайм-аутом ACE в .NET с использованием обновления адаптера данных

У меня возникла проблема с тайм-аутом при записи данных из набора данных в электронную таблицу 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 не поддерживается поставщиком. Как и время ожидания соединения, таймаут, время ожидания соединения, время ожидания соединения и т. Д. Мой код создал адаптер данных и команду InsertCommand и обновляет набор данных. Это отлично работает, если сама команда обновления не занимает более 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();

Я пропустил циклы и такие, которые фактически создают содержимое и параметры команды вставки. Поверьте, все работает нормально. 2200+ записей работают нормально.

Только после того, как я добавил таймер, я обнаружил, что проблема в тайм-ауте. При обработке 2221 записи это занимает 14,95 секунды и отлично отображается в электронной таблице. При обработке 2260 записей требуется 15,21 секунды, и ничего не отображается. Никаких ошибок нет. Я проверил состояние строки после обновления для всех строк, и все они не показывают сбоев.

Итог, поскольку свойство ConnectionTimeout имеет значение ReadOnly, а поставщик, похоже, не поддерживает тайм-аут в строке подключения, что делать ....

Спасибо.


person Bob Feeser    schedule 23.10.2012    source источник
comment
Так же, как дополнительная вещь, checkout openxml, он довольно хорошо работает с листами Excel, а также с очень большими листами Excel.   -  person kunjee    schedule 09.01.2013


Ответы (2)


Вот мои идеи:

  • Вы действительно используете это как appSetting, а не как connectionStrings? Если вы используете его как connectionStrings, проверьте это: Escape quote в 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();
    }
    
person Ludington    schedule 25.10.2012