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;
  }
}