2009-05-14 16 views
14

He estado usando Microsoft.Jet.OLEDB.4.0 y Microsoft.ACE.OLEDB.12.0 para leer en archivos .csv, .xls y .xlsx.OleDB no es compatible con el modo de 64 bits?

¡Descubrí que ninguna de estas tecnologías es compatible con el modo nativo de 64 bits!

tengo 2 preguntas:

  1. ¿Cuál es la forma compatible de leer mediante programación .csv, .xls y .xlsx en el modo de 64 bits. Solo no puedo encontrar respuestas a esto en ninguna parte.

  2. Si no puedo leer en los tres tipos de archivos , ¿cuál es la mejor manera de leer en archivos .csv en un entorno de 64 bits ?

Notas:

  • estoy usando .NET (3.5p1)
  • Esta es una aplicación de envoltura retráctil; la redistribución es un factor clave .

Actualización:

puedo usar CorFlags para forzar la aplicación se ejecute en modo de 32 bits, que funciona, pero no es deseable.

Respuesta

7

Aquí hay una discusión sobre qué hacer about deprecated MDAC. Me temo que la respuesta no es muy satisfactorio ...

Estos nuevos o convertidos aplicaciones Jet puede seguir utilizando Jet con la intención de utilizar Microsoft Office 2003 y archivos anteriores (.mdb y .xls) para datos no primarios almacenamiento. Sin embargo, para estas aplicaciones , debe planificar migrar de Jet al 2007 Office Controlador del sistema. Puede descargar el 2007 Office System Driver, que le permite leer y escribir en archivos preexistentes en Office 2003 (.mdb y .xls) o en Office 2007 (* .accdb, * .xlsm , * .xlsx y * .xlsb) formatos de archivo. IMPORTANTE Lea el Contrato de licencia de 2007 Office System End User para conocer las limitaciones de uso específico .

Nota: Las aplicaciones de SQL Server puede también acceder al sistema Office 2007, y anterior, los archivos de SQL Server de conectividad de datos heterogéneos y capacidades Integraciones Servicios como así, a través del Sistema de Oficina controlador 2007. Además, las aplicaciones de servidor SQL de 64 bits pueden acceder a los archivos Jet de 32 bits y 2007 Office System utilizando SQL Server Integration Services (SSIS) en 64 bit Windows.

+1

Parece que el 2007 Office System Driver es el camino a seguir. Sin embargo, la descarga de 25 mb es un poco abrupta. –

+0

No está claro para mí que los controladores del sistema de Office 2007 sean en realidad x64, en comparación con el reemplazo de JET ... ¿Alguien ha verificado eso? –

+0

No, definitivamente es x86, ya que me encontré con esta limitación al intentar agregar SharePoint como un servidor vinculado en MSSQL x64. No se aplica al OP, pero la forma en que trabajé a su alrededor fue instalar una instancia x86 separada que se vinculó al origen de Oledb y envolverla con un montón de vistas y la instancia x64 vinculada a la instancia x86. – Josh

1

En realidad, creo que Linq es su mejor solución para esto.

Algo así como ....

IEnumerable<MyObj> ObjList = GetObjList(yourCSVFileNAme); 

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

y su método de GetObjList se ve algo como

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

Gracias Tim! Esperaba evitar 'rodar mi propia' solución de análisis csv. Sé que no es ciencia espacial, pero a veces es sorprendentemente sutil. –

+2

Analizar un archivo CSV no es tan fácil como se publicó (texto entre paréntesis, diferente carácter de separador para diferentes configuraciones regionales, ...) pero hay muchos analizadores de CSV. – VVS

4

El principal problema es que el chorro de DBMS es una biblioteca de 32 bits que se carga en el proceso de llamada , por lo que nunca podrá usar Jet directamente desde su aplicación en el modo de 64 bits. Como mencionó Tim, usted puede escribir su propio analizador csv, pero como se trata de una aplicación de ajuste, quiere algo que maneje una gama más amplia de formatos. Afortunadamente, hay varias formas de hablar sobre aplicaciones de 32 bits, por lo que aún puedes usar Jet con un truco.

Escribo un pequeño exe marcado para ejecutarse solo en modo de 32 bits. Este exe tomaría un argumento de línea de comando del nombre del archivo para leer y el nombre de un archivo temporal para escribir. Usaría Jet para cargar csv/xls, luego colocaría los datos en una matriz de matrices y usaría el serializador xml para escribir los datos en el archivo temporal.

Entonces cuando tengo que cargar/convertir un archivo csv/xls, yo haría lo siguiente:

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

Me gusta esta opción, mantiene las cosas lo más limpias posible. Es raro que * necesite * ejecutar x64 para convertir un archivo sin formato a su objeto de datos interno; sin embargo, es probable que desee aprovechar x64 una vez que tenga los datos en sus objetos de datos internos. – Nate

4

Usted podría intentar la biblioteca FileHelpers para su análisis sintáctico de archivo plano. Funciona increíblemente bien.

+0

Gracias Christopher ... Considero FileHelpers, pero LGPL aún no es deseable incluir en una base de código comercial por lo que puedo decir ... –

+0

De acuerdo con el código fuente de FileHelpers para el manejo de archivos de Excel, utiliza AdoDB que está restringido a aplicaciones de 32 bits. Consulte la función ExtractDataTable para obtener información adicional. –

+0

@AlexanderN No veo el código fuente, pero traté con una aplicación de 64 bits para leer un archivo de Excel y funciona perfectamente. El mismo problema con mi propio código anterior que usa Ado arroja una excepción. – Samuel

3

puede leer y escribir .csv/.xls/.xlsx libros de trabajo (y more) y admite 64 bit .NET 2.0+. SpreadsheetGear se puede distribuir de forma gratuita con sus aplicaciones de envoltura retráctil.

No especificó si su aplicación es WinForms o ASP.NET pero SpreadsheetGear funciona con cualquiera de ellas. Puede ver muestras en vivo de ASP.NET (C# & VB) here, obtenga información acerca de las muestras de WinForms here y descargue una versión de prueba gratuita here si desea probarlo usted mismo.

exención de responsabilidad: Tengo SpreadsheetGear LLC

+0

Suena interesante Joe. ¡Gracias! –

2

Esto es más un puesto de información para cualquier persona que pueda estar experimentando este problema (y por mí mismo en caso que tengo el mismo problema en el futuro y no puedo recordar la solución :-)) Es una especie de oscuro, pero me causó unas pocas horas de estrés, así que tal vez ayude a alguien más ... Lo siento si esto se repite (no pude encontrarlo) o desaprobado (algunos no tienen el lujo de lo último y mejor).

Si está tratando de usar Jet 4.0 para acceder a documentos de MS Excel (u otros archivos de datos) en un servidor basado en x64, habrá descubierto que no hay soporte para esta combinación.

La única solución es permitir que IIS ejecute aplicaciones de 32 bits en Windows 64 e instalar un proveedor de db compatible.

Tendrá que instalar el controlador, proveedor OLEDB de 64 bits para ODBC (MSDASQL) que actúa como un puente: "El proveedor Microsoft OLE DB para ODBC (MSDASQL) es una tecnología que permite que las aplicaciones que se construyen en OLEDB y ADO (que utiliza OLEDB internamente) para acceder a fuentes de datos a través de un controlador ODBC. MSDASQL es un proveedor OLEDB que se conecta a ODBC, en lugar de una base de datos. MSDASQL se envía con el sistema operativo Windows y Windows Server 2008 & Windows Vista SP1 son las primeras versiones de Windows que incluyen una versión de la tecnología de 64 bits ". Descargar aquí: http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

Todo esto funciona bien, pero me encontré con dos cosas que me dejó rascándome la cabeza (y estresantes): 1) Es necesario para permitir 32 bits en IIS ASP.Net Web Service Extensions - Lea "" http://www.textcontrol.com/blog/permalink/2006082101 "" para obtener instrucciones sobre la habilitación de las aplicaciones de 32 bits Y la configuración de la extensión del servicio web IIS. 2) Si está utilizando alguna clave de registro en IIS x64, se agregará un nuevo nodo en el registro - Wow6432Node - en el que deberá mover/copiar las claves relevantes que se utilizaron en x64. es decir, teníamos una clave de datos almacenada en HCLM \ Software \ CustomKey que ya no estaba disponible cuando se habilitó 32 bits. Recreamos la clave debajo del Wow6432Node y todo fue bien.

Cuestiones relacionadas