#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, используемого там, где в столбце были смешанные типы. Это та часть, которая не работала.