Pytanie OleDB nie jest obsługiwany w trybie 64-bitowym?


Korzystam z plików Microsoft.Jet.OLEDB.4.0 i Microsoft.ACE.OLEDB.12.0 do odczytywania w plikach .csv, .xls i .xlsx.

Właśnie się dowiedziałem, że żadna z tych technologii nie jest obsługiwana w natywnym trybie 64-bitowym!

Mam 2 pytania:

  1. Jaki jest obsługiwany sposób programowo odczytywane .csv, .xls i Pliki .xlsx w trybie 64-bitowym. ja tylko nie mogę znaleźć nigdzie odpowiedzi.

  2. Jeśli nie mogę przeczytać we wszystkich trzech plikach rodzaje, jaki jest najlepszy sposób czytania w plikach .csv w 64-bitowym środowisko?

Uwagi:

  • Używam .NET (3.5p1)
  • To jest aplikacja do obkurczania; redystrybucja to główny czynnik.

Aktualizacja:

Mogę użyć CorFlags, aby wymusić uruchomienie aplikacji w trybie 32-bitowym, co działa, ale nie jest pożądane.


14
2018-05-14 00:07


pochodzenie




Odpowiedzi:


Oto dyskusja na temat tego, co należy zrobić o przestarzałym MDAC. Obawiam się, że odpowiedź nie jest zbyt satysfakcjonująca ...

Te nowe lub przekonwertowane Jet   aplikacje mogą nadal używać Jet   z zamiarem korzystania z Microsoft   Pliki Office 2003 i wcześniejsze (.mdb   i .xls) dla danych innych niż podstawowe   przechowywanie. Jednak dla nich   aplikacje, powinieneś planować   migracja z Jet do Office 2007   Sterownik systemu. Możesz pobrać   Sterownik systemu Office 2007, który   umożliwia czytanie i pisanie do   wcześniej istniejące pliki w dowolnym pakiecie Office   2003 (.mdb i .xls) lub Office   2007 (* .accdb, * .xlsm, * .xlsx i   * .xlsb) formaty plików. WAŻNE Przeczytaj użytkownika końcowego systemu Office 2007   Umowa licencyjna na konkretne użytkowanie   ograniczenia.

Uwaga: Aplikacje SQL Server również mogą   dostęp do Office System 2007 i   wcześniej pliki z SQL Server   heterogeniczna łączność danych i   Funkcje usług integracji, jak   cóż, za pośrednictwem Office System 2007   Kierowca. Dodatkowo 64-bitowy SQL   Aplikacje serwerowe mogą uzyskać dostęp do   32-bitowy system Jet i pakiet Office 2007   pliki przy użyciu 32-bitowego serwera SQL   Usługi integracyjne (SSIS) w wersji 64-bitowej   Windows.


7
2018-05-14 00:30



Wygląda na to, że Sterownik Office System 2007 jest do zrobienia. Pobieranie 25 MB jest jednak dość strome. - Richard Szalay
Nie jest dla mnie jasne, że sterowniki Office System 2007 są w rzeczywistości x64, w przeciwieństwie do zwykłego zamiennika JET ... Czy ktoś to zweryfikował? - Mark Brackett
Nie jest to zdecydowanie x86, ponieważ właśnie wpadłem na to ograniczenie, próbując dodać SharePoint jako połączony serwer w MSSQL x64. Nie dotyczy OP, ale sposób w jaki pracowałem, polegał na zainstalowaniu oddzielnej instancji x86, która była połączona ze źródłem Oledb i opakowała ją w garść widoków oraz instancję x64 połączoną z instancją x86. - Josh


Głównym problemem jest to, że Jet DBMS jest 32-bitową biblioteką, która ładuje się do procesu wywołującego, dzięki czemu nigdy nie będziesz mógł używać Jet bezpośrednio z poziomu aplikacji w trybie 64-bitowym. Jak wspomniał Tim, możesz napisać swój własny parser CSV, ale ponieważ jest to aplikacja typu shrink-wrap, potrzebujesz czegoś, co będzie obsługiwać szerszy zakres formatów. Na szczęście istnieje wiele sposobów mówienia o aplikacjach 32-bitowych, więc nadal możesz używać aparatu Jet z podstępem.

Napisałbym trochę exe, który został oznaczony do uruchomienia tylko w trybie 32-bitowym. Ten exe pobiera argument wiersza poleceń od nazwy pliku do odczytania oraz nazwę pliku tymczasowego, do którego ma zostać zapisany. Chciałbym użyć Jet do załadowania csv / xls, następnie umieścić dane w tablicy tablic i użyć serializatora xml do zapisania danych do pliku tymczasowego.

Następnie, kiedy muszę załadować / przekonwertować plik csv / xls, powinienem wykonać następujące czynności:

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

4
2018-05-17 08:00



Podoba mi się ta opcja, utrzymuje wszystko tak czyste, jak to możliwe. To rzadkie, że będziesz potrzeba do uruchamiania x64 do konwersji płaskiego pliku do twojego wewnętrznego obiektu danych; Jednak najprawdopodobniej będziesz chciał skorzystać z x64, gdy dane znajdą się w twoich wewnętrznych obiektach danych. - Nate


Możesz spróbować FileHelpers biblioteka do parsowania plików płaskich. Działa zadziwiająco dobrze.


4
2018-05-18 17:45



Dzięki Christopher ... Wziąłem pod uwagę FileHelpers, ale LGPL jest nadal niepożądane, aby uwzględnić w kodzie komercyjnym bazę, o ile mogę powiedzieć ... - John Weldon
Zgodnie z kodem źródłowym FileHelpers do obsługi plików Excel, korzysta z AdoDB, który jest ograniczony do aplikacji 32-bitowych. Aby uzyskać dodatkowe informacje, patrz funkcja ExtractDataTable. - Alex Nolasco
@AlexanderN Nie widzę kodu źródłowego, ale próbowałem z aplikacją 64-bitową, aby odczytać plik Excela i działa idealnie. Ten sam problem z moim własnym starym kodem za pomocą Ado rzuca wyjątek. - Samuel
+1 dla tej ładnej biblioteki. Uwielbiam sposób, w jaki mogę zautomatyzować kolumnę pliku Excela właściwościami mojej klasy; oszczędza mi to dużo czasu! - Samuel


SpreadsheetGear dla .NET potrafi czytać i pisać .csv / .xls / .xlsx skoroszytów (i jeszcze) i obsługuje 64-bitowy .NET 2.0+. SpreadsheetGear można dystrybuować bezpłatnie za pomocą aplikacji do pakowania w folię termokurczliwą.

Nie określiłeś, czy twoja aplikacja to WinForms, czy ASP.NET, ale SpreadsheetGear działa z którąkolwiek z nich. Możesz zobaczyć na żywo próbki ASP.NET (C # i VB) tutaj, zapoznaj się z przykładami WinForm tutaj i pobierz bezpłatną wersję próbną tutaj jeśli chcesz spróbować samemu.

Zastrzeżenie: posiadam SpreadsheetGear LLC


3
2017-07-10 15:15



Brzmi interesująco Joe. Dzięki! - John Weldon


Możesz użyć Microsoft Access Database Engine 2010 Redistributable do odczytu i zapisu danych csv, xls itp. Istnieje wersja 32 i 64-bitowa każdego sterownika.


3
2018-01-15 18:57



miły! Miałem nadzieję, że coś pojawi się wcześniej czy później ze stwardnienia rozsianego - John Weldon


Jest to bardziej informacyjny post dla każdego, kto może doświadczać tego problemu (i dla siebie mam taki sam problem w przyszłości i nie pamiętam rozwiązania :-)) To trochę niejasne, ale spowodowało mi kilka godzin stresu, więc może to pomoże komuś innemu ... Przepraszam, jeśli to się powtórzy (nie udało się go znaleźć) lub przestarzałe (niektóre nie mają luksusu najnowszego i największego ).

Jeśli próbujesz użyć Jet 4.0 do uzyskania dostępu do dokumentów MS Excel (lub innych plików danych) na serwerze z procesorem x64, odkryjesz, że nie ma obsługi tej kombinacji.

Jedynym rozwiązaniem jest zezwolenie usługom IIS na uruchamianie aplikacji 32-bitowych w systemie Windows 64 i instalowanie obsługiwanego dostawcy bazy danych.

Będziesz musiał zainstalować sterownik, 64-bitowy dostawca OLEDB dla ODBC (MSDASQL), który działa jak most: "Microsoft OLE DB Provider dla ODBC (MSDASQL) to technologia, która pozwala aplikacjom zbudowanym na OLEDB i ADO (która wykorzystuje wewnętrznie OLEDB) w celu uzyskania dostępu do źródeł danych za pośrednictwem sterownika ODBC MSDASQL jest dostawcą OLEDB, który łączy się z ODBC, zamiast tego MSDASQL jest dostarczany z systemem operacyjnym Windows, a Windows Server 2008 i Windows Vista SP1 są pierwszymi wersjami systemu Windows, które zawierają 64-bitową wersję tej technologii. " Pobierz tutaj : http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

Wszystko działa dobrze, ale natknąłem się na dwie rzeczy, które sprawiły, że podrapałem się w głowę (i podkreśliłem): 1) Musisz zezwolić na 32-bitową ASP.Net w Rozszerzeniach usług sieci Web IIS - Odczyt ""http://www.textcontrol.com/blog/permalink/2006082101"" instrukcje dotyczące włączania aplikacji 32-bitowych ORAZ konfiguracji rozszerzenia usług sieci Web IIS. 2) Jeśli używasz kluczy rejestru w IIS x64, nowy węzeł zostanie dodany do rejestru - Wow6432Node - do którego będziesz musiał przenieść / skopiować wszystkie odpowiednie klucze, które były używane pod x64. tj. mieliśmy klucz danych przechowywany w HCLM \ Software \ CustomKey, który nie był już dostępny, gdy włączona była wersja 32-bitowa. Ponownie stworzyliśmy klucz pod Wow6432Node i wszystko było dobrze.


2
2018-05-06 11:39





Właściwie myślę, że Linq jest dla ciebie najlepszym rozwiązaniem.

Coś jak....

IEnumerable<MyObj> ObjList = GetObjList(yourCSVFileNAme);

var qry = from o in ObjList
          where o.MyField == Something
          select o;

a twoja metoda GetObjList wygląda podobnie

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

1
2018-05-14 00:44



Dzięki Tim! Miałem nadzieję, że uniknę "rozwijania własnego" rozwiązania parsującego csv. Wiem, że to nie jest nauka o rakietach, ale czasami jest zaskakująco subtelna. - John Weldon
Parsowanie pliku CSV nie jest tak proste jak wysłanie (tekst w nawiasach, różne znaki separatora dla różnych ustawień narodowych, ...) ale istnieje wiele parserów CSV. - VVS