Oledb чтение нескольких файлов Excel на сервере вызывает ошибку типа

#c# #excel #oledb #jet

#c# #excel #oledb #jet

Вопрос:

Изначально у меня была проблема с типом данных «догадки» при работе с драйвером jet (через oledb). Если бы на листе были смешанные типы, это привело бы к нулевым / пустым значениям.

-Редактировать-

В строке подключения, а также в реестре есть параметр IMEX, который указывает jet / ace использовать текст для столбцов с несколькими типами данных. Таким образом, если первые 6 строк имеют целочисленное значение, а 7-я ячейка имеет текстовое значение, ошибки приведения типа не будет. В реестре также есть настройка (и строка подключения), которая позволит вам указать, сколько строк jet следует использовать для выборки.

-завершение редактирования-

Я изменил строку подключения и настройки реестра на сервере. Итак, теперь программа читает нормально. Он будет считывать значения как текст, а не использовать {n} строк для выборки. Я думал, что все работает нормально.

Теперь у меня есть источник данных, в котором перечислены файлы для чтения. Если у меня там несколько файлов, у него будут те же проблемы с приведением типов… или, по крайней мере, те же симптомы. Если я загружаю файлы по одному, не используя очередь, тогда все работает нормально. Кажется, что проблема с приведением типов возникает, когда у меня несколько файлов подряд.

Я не совсем уверен, что вызывает это при чтении нескольких файлов подряд, но не при чтении по одному за раз. Соединение открывается, считывает все данные, а затем закрывается… так что я не думаю, что это связано с этим.

Я просто ищу какие-либо идеи? Было достаточно сложно найти исходную проблему. Кажется, что работа с Jet требует боли в заднице.


Добавлен соответствующий код согласно запросу

 public static readonly String CONNECTION_STRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data   Source={0};Extended Properties="Excel 12.0 Xml;HDR=YES; ReadOnly=True;IMEX=1;"";

private System.Data.DataTable Query(String worksheetName, String selectList = "*")
{
    DataTable table = new DataTable();

    _connection.Open();
    var query = String.Format(Constants.DATA_QUERY, selectList, worksheetName);
    new OleDbDataAdapter(query, _connection).Fill(table);
    _connection.Close();
    return table;
}
  

Комментарии:

1. И где ваш соответствующий код?

2. Несколько файлов определенно НЕ вызывают вашу проблему. Какова ваша логика? Я не помню, чтобы мне нужно было редактировать реестр для чтения excel workbooks . Используйте ACE OleDB , и у вас не должно возникнуть проблем с его чтением. Действительно. вы так много написали, но ничего, что могло бы помочь понять вашу проблему

3. @T.S. Существует параметр IMEX для случаев, когда Excel угадывает неправильный тип данных. Итак, что произойдет, если ваши первые 6 строк будут иметь целочисленные типы, а 10-я строка — текст, у него будет сбой приведения типа и будет введено значение «» для 10-й строки.

4. Вам нужно написать свою логику для анализа типа. Что я сделал в одном приложении, так это то, что я проанализировал все строки как текст, а затем каждая строка прошла проверку данных, а те, которые не удалось, были добавлены в журнал. Позже пользователь может перейти к этому журналу и загрузить эти неудачные строки как Excel. Пользователь быстро исправит это [потому что присутствуют только неудачные строки] и повторно загрузит файл. Вам нужно работать в направлении построения логики, которая позаботится о ваших проблемах несовместимости, или использовать только строки.

5. Я настроил его на чтение всех смешанных типов в виде текста. Это работает, когда он читает файл, это когда я читаю несколько файлов подряд, это, кажется, игнорируется. В этой ситуации мне не разрешено заставлять пользователя исправлять файл.

Ответ №1:

Я бы рекомендовал использовать собственную библиотеку, если это возможно, что-то вроде Excel Data Reader или EPPlus вместо OLEDB

Комментарии:

1. Спасибо за рекомендацию. Я рассмотрю эти элементы.

2. Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы только для ссылок могут стать недействительными, если связанная страница изменится.

3. @Iano’Brien Конечно, я бы обычно это делал, однако это не статьи, а сторонние библиотеки 3d. Или я должен был опубликовать это просто как комментарий, поскольку он не дает прямого ответа на вопрос?

4. Я оказался в ситуации, когда я могу отказаться от Jet / Ace. Однако это не всегда так. Я хотел бы отметить, что на самом деле это не отвечает на поставленный вопрос. (Это означает, что он не пытается решить реальную проблему)

Ответ №2:

Я нашел решение здесь

https://www.codeproject.com/Tips/702769/How-to-Get-Data-from-Multiple-Workbooks-using-One

Настройка поставщика:

 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:pathfileName1.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
  

Оператор SQL должен быть установлен следующим образом:

 Select * From[Hoja1$]
UNION ALL
Select * From [Hoja1$] IN 'C:pathfileName2.xls' 'Excel 8.0;HDR=Yes;IMEX=1'
  

Если вы хотите создать внутреннее соединение

 Select * from [Hoja1$] as a
INNER JOIN (select * from [Hoja1$] IN 'C:pathfileName2.xls' 'Excel 8.0;HDR=Yes;IMEX=1') as b
ON a.FOLIO=b.FOLIO
  

Комментарии:

1. Ваш драйвер — Microsoft.Jet.OLEDB.4.0, а мой — Microsoft.ACE.OLEDB.12.0, поэтому вы можете подключаться к стандартным файлам Excel, но не к xlsx. Ace обратно совместим, но jet не продвигается вперед. Этому вопросу также 6 лет.

2. Также стоит отметить, что получение данных из нескольких источников не было проблемой. Проблема заключалась в выборке параметра imex, используемого там, где в столбце были смешанные типы. Это та часть, которая не работала.