OutOfMemoryException при попытке прочитать большой файл Excel в DataTable

2

Я использую пакет служб SSIS для очистки и загрузки данных из файла .Xlsx в таблицу SQL Server. Я также должен выделить ячейки, содержащие неправильные данные в файле .Xlsx, для этого я должен получить обратно индексы столбцов и строк на основе имени столбца и идентификатора строки (что у меня есть в моей электронной таблице данных). Для этого я сравниваю имя каждого столбца из моей первой электронной таблицы (Error_Sheet) со строками столбца, которые я добавил во второй электронной таблице, и делаю то же самое для строк, и если у меня одинаковое значение ячеек, я получаю обратно столбец и индексы строк моей таблицы данных и выделите ячейку на основе этого столбца и индекса строки. Сценарий работал нормально, но после попытки запустить его с сервера я получил исключение памяти, а также на своей рабочей станции, где раньше он работал нормально.

Я пытался уменьшить диапазон, из которого я беру данные: от AC1:AC10000 до AC1:AC100, он работал только после первой компиляции, но продолжает выдавать исключение снова.

string strSQLErrorColumns = "Select * From [" + Error_Sheet + "AC1:AC100]";
OleDbConnection cn = new OleDbConnection(strCn);

OleDbDataAdapter objAdapterErrorColumns = new OleDbDataAdapter(strSQLErrorColumns, cn);
System.Data.DataSet dsErrorColumns = new DataSet();
objAdapterErrorColumns.Fill(dsErrorColumns, Error_Sheet);
System.Data.DataTable dtErrorColumns = dsErrorColumns.Tables[Error_Sheet];
dsErrorColumns.Dispose();
objAdapterErrorColumns.Dispose();

foreach (DataColumn ColumnData in dtDataColumns.Columns){
    ColumnDataCellsValue = dtDataColumns.Columns[iCntD].ColumnName.ToString();
    iCntE = 0;

    foreach (DataRow ColumnError in dtErrorColumns.Rows){
        ColumnErrorCellsValue = dtErrorColumns.Rows[iCntE].ItemArray[0].ToString();

        if (ColumnDataCellsValue.Equals(ColumnErrorCellsValue)){

            ColumnIndex = ColumnData.Table.Columns[ColumnDataCellsValue].Ordinal;
            iCntE = iCntE + 1;
            break;
            }
        }

        iCntD = iCntD + 1;
    }

ColumnIndexHCell = ColumnIndex + 1;          
RowIndexHCell = RowIndex + 2;

Range rng = xlSheets.Cells[RowIndexHCell, ColumnIndexHCell] as Excel.Range;
rng.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Yellow);

Есть ли другой способ загрузки данных в DataTable, чтобы получить индекс столбца и строки без использования большого количества памяти или с помощью Excel.Range.Cell вместо набора данных и DataTable, чтобы получить значение ячейки, индекс столбца и строки из файла xlsx, пожалуйста?

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

  • 0
    Я запутался, почему это помечено как SSIS, если вы не используете SSIS для чтения данных? Диспетчер соединений SSIS Excel будет обрабатывать кэширование и буферизацию строк, поэтому C # не требуется.
  • 0
    @ M.ECH проблема решена ??
Показать ещё 2 комментария
Теги:
excel
ssis
etl
script-task

1 ответ

2
Лучший ответ

При попытке чтения данных из Excel с огромным количеством строк лучше считывать данные по блокам (в OleDbDataAdapter вы можете использовать опцию подкачки для достижения этой цели).

int result = 1;
int intPagingIndex = 0;
int intPagingInterval = 1000;

while (result > 0){

    result = daGetDataFromSheet.Fill(dsErrorColumns,intPagingIndex, intPagingInterval , Error_Sheet);
    System.Data.DataTable dtErrorColumns = dsErrorColumns.Tables[Error_Sheet];

    //Implement your logic here

    intPagingIndex += intPagingInterval ;

}

Это предотвратит исключение OutOfMemory. И больше не нужно указывать диапазон как AC1:AC10000

Рекомендации

  • 0
    извините, я не мог ответить до сегодняшнего дня. Я фактически использовал Interop вместо Paging У меня ушло меньше времени на его применение. Но я буду использовать его и особенно пойму, когда у меня будет больше возможностей в следующий раз. Еще раз спасибо за вашу драгоценную помощь, как обычно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню