OleDB не поддерживается в 64-битном режиме?
Я использую Microsoft.Jet.OLEDB.4.0 и Microsoft.ACE.OLEDB.12.0 для чтения в файлах .csv,.xls и .xlsx.
Я только узнал, что ни одна из этих технологий не поддерживается в собственном 64-битном режиме!
У меня есть 2 вопроса:
-
Каков поддерживаемый способ
программно читать .csv,.xls и
.xlsx в 64-битном режиме. я просто
не может найти ответы на это где угодно.
-
Если я не могу прочитать во всех трех файлах
типы, что лучше всего читать
в .csv файлах в 64-битном
окружающая среда?
Примечания:
- Я использую .NET(3.5p1)
- Это приложение для упаковки в термоусадочную пленку; перераспределение
ключевой фактор.
Update:
Я могу использовать CorFlags, чтобы заставить приложение работать в 32-битном режиме, который работает, но нежелателен.
Ответы
Ответ 1
Здесь обсуждается, что делать об устаревших MDAC. Я боюсь, что ответ не очень приятный...
Эти новые или конвертированные Jet приложения могут продолжать использовать Jet с целью использования Microsoft Файлы Office 2003 и более ранние (.mdb и .xls) для непервичных данных место хранения. Однако для этих приложений, вы должны планировать перейти от Jet к Office 2007 Системный драйвер. Вы можете скачать 2007 Драйвер системы Office, который позволяет читать и записывать ранее существовавшие файлы в Office 2003 (.mdb и .xls) или Office 2007 (*.accdb, *.xlsm, *.xlsx и *.xlsb). ВАЖНО Пожалуйста, ознакомьтесь с конечным пользователем системы Office 2007 Лицензионное соглашение для конкретного использования ограничения.
Примечание. Приложения SQL Server также могут доступа к Системе Office 2007 и ранее, файлы из SQL Server гетерогенная связь данных и Интеграция а также через систему Office 2007 Водитель. Кроме того, 64-разрядный SQL Серверные приложения могут получить доступ к 32-разрядная версия Jet и 2007 файлов с использованием 32-разрядного SQL Server Услуги интеграции (SSIS) на 64-разрядной Windows.
Ответ 2
Основная проблема заключается в том, что СУБД Jet представляет собой 32-битную библиотеку, которая загружается в вызывающий процесс, поэтому вы никогда не сможете использовать Jet непосредственно из своего приложения в 64-битном режиме. Поскольку Тим упомянул, что вы можете написать свой собственный синтаксический анализатор csv, но поскольку это приложение для сжатия, вам нужно что-то, что будет обрабатывать более широкий диапазон форматов. К счастью, есть несколько способов поговорить с 32-битными приложениями, поэтому вы можете использовать Jet с трюком.
Я бы написал небольшой exe, который был помечен для запуска только в 32-битном режиме. Этот exe принимает аргумент командной строки имени файла для чтения и имя файла temp для записи. Я бы использовал Jet для загрузки csv/xls, затем помещал данные в массив массивов и использовал сериализатор xml для записи данных в файл temp.
Затем, когда мне нужно загрузить/преобразовать файл csv/xls, я бы сделал следующее:
object[][] ConvertFile(string csvOrXlsFile)
{
var output = System.IO.Path.GetTempFileName();
try
{
var startinfo = new System.Diagnostics.ProcessStartInfo("convert.exe",
string.Format("\"{0}\" \"{1}\"", csvOrXlsFile, output));
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = startinfo;
proc.Start();
proc.WaitForExit();
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(object[][]));
using (var reader = System.IO.File.OpenText(output))
return (object[][])serializer.Deserialize(reader);
}
finally
{
if (System.IO.File.Exists(output))
System.IO.File.Delete(output);
}
}
Ответ 3
Вы можете попробовать библиотеку FileHelpers для анализа паркета. Отлично работает.
Ответ 4
SpreadsheetGear для .NET может читать и писать книги .csv/.xls/.xlsx(и больше) и поддерживает 64-разрядную версию .NET 2.0+. SpreadsheetGear может быть распределен без роялти с вашими приложениями для упаковки в термоусадочную пленку.
Вы не указали, является ли ваше приложение WinForms или ASP.NET, но SpreadsheetGear работает с ним. Вы можете увидеть живые примеры ASP.NET(С# и VB) здесь, узнать о образцах WinForms здесь и скачайте бесплатную пробную версию здесь, если вы хотите попробовать сами.
Отказ от ответственности: у меня есть SpreadsheetGear LLC
Ответ 5
Вы можете использовать Microsoft Access Database Engine 2010 Redistributable для чтения и записи доступа csv, xls и т.д. Существует 32 и 64-разрядная версия каждого драйвера.
Ответ 6
Это больше информационный пост для всех, кто может столкнуться с этой проблемой (и для себя, у меня есть такая же проблема в будущем и не могу вспомнить решение:-))
Это вроде неясное, но вызвало у меня несколько часов стресса, поэтому, возможно, это поможет кому-то еще... Извините, если это повторяется (не удалось найти) или устарело (у некоторых нет роскоши последних и самых больших).
Если вы пытаетесь использовать Jet 4.0 для доступа к документам MS Excel (или другим файлам данных) на сервере на базе x64, вы обнаружите, что поддержка этой комбинации отсутствует.
Единственное решение - позволить IIS запускать 32-разрядные приложения в Windows 64 и устанавливать поддерживаемый поставщик db.
Вам понадобится установить драйвер, 64-разрядный поставщик OLEDB для ODBC (MSDASQL), который действует как мост:
"Поставщик Microsoft OLE DB для ODBC (MSDASQL) - это технология, которая позволяет приложениям, которые построены на OLEDB и ADO (который использует OLEDB внутри) для доступа к источникам данных через драйвер ODBC. MSDASQL - это поставщик OLEDB, который подключается к ODBC, вместо этого базы данных. MSDASQL поставляется с операционной системой Windows, а Windows Server 2008 и Windows Vista SP1 - это первые выпуски Windows, включающие 64-битную версию технологии".
Скачать здесь: http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en
Все это прекрасно работает, но я наткнулся на две вещи, которые заставили меня почесывать голову (и подчеркивать):
1) Вам нужно разрешить 32-разрядный ASP.Net в расширениях веб-служб IIS - Читать " http://www.textcontrol.com/blog/permalink/2006082101" " для инструкций по включению 32-разрядных приложений и настройке расширения веб-службы IIS.
2) Если вы используете любые разделы реестра в IIS x64, в реестр будет добавлен новый node - Wow6432Node - в который вам нужно будет переместить/скопировать любые соответствующие ключи, которые использовались в x64.
т.е. у нас был ключ данных, хранящийся в HCLM\Software\CustomKey, который больше не был доступен, когда была включена 32-битная. Мы повторно создали ключ под Wow6432Node, и все было хорошо.
Ответ 7
На самом деле я думаю, что Linq - ваше лучшее решение для этого.
Что-то вроде....
IEnumerable<MyObj> ObjList = GetObjList(yourCSVFileNAme);
var qry = from o in ObjList
where o.MyField == Something
select o;
и ваш метод GetObjList выглядит примерно так:
Public IEnumerable<MyObj> GetObjList(string filename)
{
// Obvioulsly you would have some actual validation and error handling
foreach(string line in File.ReadAllLines(filename))
{
string[] fields = line.Split(new char[]{','});
MyObj obj = new MyObj();
obj.Field = fields[0];
obj.AnotherField = int32.Parse(fields[1]);
yield return obj;
}
}