Помогите мне найти утечку в этом коде импорта Excel - PullRequest
0 голосов
/ 01 сентября 2009

Конечно, работает следующий метод, но после определенного количества загрузок (это не является постоянным) мой клиент получает страшную ошибку: «System.Data.OleDb.OleDbException: Unspecified error»

Шаги:

  1. Клиент загружает файл Excel с помощью элемента управления загрузкой файлов
  2. Файл сохранен в файловой системе
  3. Файл открывается через провайдера oledb и считывается в набор данных

Мое единственное предположение, что провайдер почему-то не высвобождает ресурсы.

Единственный способ устранить это (временно) - сбросить IIS. По этой причине я склонен думать, что провайдер может быть заблокирован другими сайтами на этом сервере. Мы размещаем один сайт для клиента (мы его не создавали), который использует этого провайдера, поэтому возможно, что с его стороны возникнет проблема. Кто-нибудь может прокомментировать это?

Пожалуйста, ознакомьтесь с методом ниже и помогите мне избавиться от этой проблемы!

Public Shared Function GetExcelData(ByVal excelFile As String, ByVal sheetNumber As Integer) As DataSet

    Dim connString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", excelFile)
    Dim excelDataSet As New DataSet()

    Using conn As New OleDbConnection(connString)
        conn.Open()
        Using dt As DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)

            Dim excelSheets(dt.Rows.Count) As String
            Dim i As Integer = 0
            For Each row As DataRow In dt.Rows
                excelSheets(i) = row("TABLE_NAME").ToString
                i += 1
                If i = sheetNumber Then
                    Exit For
                End If
            Next

            Using excelCommand As New OleDbCommand("Select * from [" & excelSheets(sheetNumber - 1) & "]", conn)
                Using excelAdapter As OleDbDataAdapter = New OleDbDataAdapter(excelCommand)
                    excelAdapter.Fill(excelDataSet)
                End Using
            End Using

        End Using
        conn.Close()
    End Using

    Return excelDataSet

End Function

Ответы [ 3 ]

0 голосов
/ 01 сентября 2009

Сразу после сравнения со строкой подключения:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelDataFile + ";Extended Properties=\"Excel 8.0;ImportMixedTypes=Text;HDR=YES;IMEX=1;\"

хотя я предполагаю, что \ "не нужны.

0 голосов
/ 21 сентября 2009

Кажется, что нет реального решения с использованием поставщика oledb.

Итак, я собираюсь сделать так, чтобы клиент конвертировал свою электронную таблицу в CSV (это возможно в данном случае, так как это импорт из одной таблицы).

Затем я нашел здесь отличный анализатор CSV:

http://www.codeproject.com/KB/database/CsvReader.aspx

0 голосов
/ 01 сентября 2009

Я не знаю, в чем причина вашей ошибки, но я знаю, что, учитывая код, который вы показали, нет смысла перебирать все записи в вашей таблице данных. Кроме того, вы можете группировать операторы Using, чтобы избежать глубокого вложения, а метод .Fill() имеет перегрузки, которые позволяют вам указывать имя таблицы или даже заполнять таблицу напрямую, а не использовать весь набор данных. Любой из них может показаться лучшим выбором, чем просто возвращение набора данных с одной безымянной таблицей.

Dim sheetName As String = dt.Rows(sheetNumber)("TABLE_NAME")

Using excelCommand As New OleDbCommand( _
   String.Format("Select * from [{0}]", sheetName), conn), _
  excelAdapter As OleDbDataAdapter = New OleDbDataAdapter(excelCommand)

    excelAdapter.Fill(excelDataSet, sheetName)

End Using

Что касается вашей конкретной проблемы, я думаю, что в имени файла есть недопустимый символ, который вызывает проблемы со строкой соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...