OleDB не поддерживается в 64-битном режиме? - PullRequest
14 голосов
/ 14 мая 2009

Я использую Microsoft.Jet.OLEDB.4.0 и Microsoft.ACE.OLEDB.12.0 для чтения файлов .csv, .xls и .xlsx.

Я только что узнал, что ни одна из этих технологий не поддерживается в собственном 64-битном режиме!

У меня есть 2 вопроса:

  1. Каков поддерживаемый способ программно читать .csv, .xls и Файлы .xlsx в 64-битном режиме. я просто не могу найти ответы на это нигде.

  2. Если я не могу прочитать все три файла типы, как лучше читать в .csv файлах в 64 бит окружающая среда

Примечания:

  • Я использую .NET (3.5p1)
  • Это приложение для упаковки в термоусадочную пленку; перераспределение является ключевой фактор.

Обновление:

Я могу использовать CorFlags, чтобы заставить приложение работать в 32-битном режиме, который работает, но не желательно.

Ответы [ 7 ]

8 голосов
/ 14 мая 2009

Здесь обсуждается, что делать с устаревшим MDAC . Боюсь, ответ не очень удовлетворительный ...

Эти новые или переделанные Jet приложения могут продолжать использовать Jet с намерением использовать Microsoft Office 2003 и более ранние файлы (.mdb и .xls) для неосновных данных место хранения. Однако для этих приложения, вы должны планировать перейти с Jet на Office 2007 Системный драйвер. Вы можете скачать Драйвер системы Office 2007, который позволяет читать и писать в предварительно существующие файлы в любом офисе 2003 (.mdb и .xls) или офис 2007 (* .accdb, * .xlsm, * .xlsx и * .xlsb) форматы файлов. ВАЖНО! Прочтите, пожалуйста, Конечный пользователь системы Office 2007 Лицензионное соглашение для конкретного использования ограничения.

Примечание. Приложения SQL Server также могут получить доступ к Система Office 2007 и ранее файлы из SQL Server разнородное подключение данных и Возможности Integrations Services as ну через систему Office 2007 Водитель. Кроме того, 64-битный SQL Серверные приложения могут получить доступ к 32-битный Jet и Система Office 2007 файлы с помощью 32-разрядного SQL Server Службы интеграции (SSIS) на 64-разрядных Окна.

4 голосов
/ 10 июля 2009

SpreadsheetGear for .NET может читать и записывать книги .csv / .xls / .xlsx (и more ) и поддерживает 64-разрядную версию .NET 2.0+. SpreadsheetGear можно распространять бесплатно с вашими приложениями для термоусадочной пленки.

Вы не указали, является ли ваше приложение WinForms или ASP.NET, но SpreadsheetGear работает с ними. Вы можете посмотреть живые образцы ASP.NET (C # & VB) здесь , узнать о образцах WinForms здесь и загрузить бесплатную пробную версию здесь , если хотите это сам.

Отказ от ответственности: я владею SpreadsheetGear LLC

4 голосов
/ 18 мая 2009

Вы можете попробовать библиотеку FileHelpers для анализа плоских файлов. Работает на удивление хорошо.

4 голосов
/ 17 мая 2009

Основная проблема заключается в том, что СУБД Jet является 32-битной библиотекой, которая загружается в вызывающий процесс, поэтому вы никогда не сможете использовать Jet напрямую из приложения в 64-битном режиме. Как упоминал Тим, вы могли бы написать свой собственный парсер csv, но, поскольку это приложение с термоусадочной пленкой, вам нужно что-то, что будет обрабатывать более широкий диапазон форматов. К счастью, есть 32 способа поговорить о 32-битных приложениях, поэтому вы все равно можете использовать Jet с хитростью.

Я бы написал маленький exe, который был помечен для запуска только в 32-битном режиме. Этот exe-файл принимает аргумент командной строки для имени файла для чтения и имени временного файла для записи. Я бы использовал Jet для загрузки csv / xls, затем поместил данные в массив массивов и использовал сериализатор xml для записи данных во временный файл.

Затем, когда мне нужно загрузить / преобразовать файл 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 голосов
/ 06 мая 2010

Это скорее информационный пост для тех, кто может столкнуться с этой проблемой (и для себя, если у меня возникнет та же проблема в будущем, и я не могу вспомнить решение :-)) Это немного неясно, но вызвало у меня несколько часов стресса, так что, может быть, это поможет кому-то еще ... Извините, если это повторяется (не удалось найти) или устарело (некоторые не могут позволить себе роскошь последних и самых больших ).

Если вы пытаетесь использовать Jet 4.0 для доступа к документам MS Excel (или другим файлам данных) на сервере x64, вы обнаружите, что эта комбинация не поддерживается.

Единственное решение - разрешить IIS запускать 32-разрядные приложения в Windows 64 и установить поддерживаемый поставщик БД.

Вам потребуется установить драйвер 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, в реестр будет добавлен новый узел - Wow6432Node, в который вам нужно будет переместить / скопировать все соответствующие ключи, которые использовались в x64. у нас был ключ данных, сохраненный в HCLM \ Software \ CustomKey, который больше не был доступен, когда был включен 32-битный. Мы заново создали ключ под узлом Wow6432, и все было хорошо.

3 голосов
/ 15 января 2010

Вы можете использовать Microsoft Access Database Engine 2010 Redistributable для чтения и записи csv, xls access и т. Д. Существует 32- и 64-разрядная версия каждого драйвера.

1 голос
/ 14 мая 2009

На самом деле я думаю, что 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;
  }
}
...