2009-05-14 7 views
14

J'ai utilisé Microsoft.Jet.OLEDB.4.0 et Microsoft.ACE.OLEDB.12.0 pour lire des fichiers .csv, .xls et .xlsx.OleDB non pris en charge en mode 64 bits?

Je viens de découvrir qu'aucune de ces technologies n'est supportée en mode natif 64 bits!

J'ai 2 questions:

  1. Quel est le moyen pris en charge pour lire programatically .csv, .xls et .xlsx en mode 64 bits. Je viens de ne trouve pas de réponses à cela n'importe où.

  2. Si je ne peux pas lire dans les trois fichiers types, ce qui est la meilleure façon de lire dans les fichiers .csv dans un environnement 64 bits ?

Notes:

  • J'utilise .NET (3.5p1)
  • Ceci est une application de pellicule rétractable; la redistribution est un facteur clé .

Mise à jour:

Je peux utiliser CorFlags pour forcer l'application à exécuter en mode 32 bits, ce qui fonctionne, mais il est pas souhaitable.

Répondre

7

Voici une description de ce qu'il faut faire about deprecated MDAC. Je crains que la réponse n'est pas très satisfaisant ...

Ces nouveaux ou convertis applications Jet peuvent continuer à utiliser Jet avec l'intention d'utiliser Microsoft Office 2003 et les fichiers antérieurs (.mdb et .xls) pour les données non primaires stockage. Toutefois, pour ces applications , vous devez planifier la migration de de Jet vers le pilote système Office 2007 . Vous pouvez télécharger le 2007 Office System Driver, dont vous permet de lire et d'écrire à les fichiers préexistants dans Office 2003 (.mdb et .xls) ou Office 2007 (* .accdb, * .xlsm , * .xlsx et * .xlsb) formats de fichier. IMPORTANT Veuillez lire les limitations du Contrat de Licence de l'Utilisateur final Office 2007 pour des limitations spécifiques d'utilisation .

Remarque: les applications SQL Server peut également accéder au système Office 2007, et plus tôt, les fichiers de SQL Server de connectivité de données hétérogènes et capacités Intégrations services ainsi , via le système Office 2007 pilote. En outre, les applications serveur SQL 64 bits peuvent accéder à Jet 32 ​​bits et 2007 Office System fichiers en utilisant SQL Server 32 bits Services d'intégration (SSIS) sur 64 bits Windows.

+1

On dirait que le pilote Office System 2007 est la solution idéale. Le téléchargement 25mb est un peu raide, cependant. –

+0

Il n'est pas clair pour moi que les pilotes Office System 2007 sont réellement x64, par opposition à juste le remplacement de JET ... Quelqu'un at-il vérifié cela? –

+0

Non, c'est définitivement x86 car je viens de rencontrer cette limitation en essayant d'ajouter SharePoint en tant que serveur lié dans MSSQL x64. Non applicable à l'OP mais la façon dont j'ai travaillé autour d'elle consistait à installer une instance x86 séparée liée à la source Oledb et enveloppée avec un tas de vues et l'instance x64 liée à l'instance x86. – Josh

1

En fait, je pense que Linq est votre meilleure solution pour cela.

Quelque chose comme ....

IEnumerable<MyObj> ObjList = GetObjList(yourCSVFileNAme); 

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

et votre méthode de GetObjList ressemble à quelque chose comme

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

Merci Tim! J'espérais éviter de «rouler ma propre» solution d'analyse de csv. Je sais que ce n'est pas sorcier, mais c'est parfois étonnamment subtil. –

+2

L'analyse d'un fichier CSV n'est pas aussi simple que l'affichage (texte entre parenthèses, caractère séparateur différent pour différents paramètres régionaux, ...) mais il y a beaucoup d'analyseurs CSV disponibles. – VVS

4

Le principal problème est que le SGBD Jet est une bibliothèque de 32 bits qui est chargé dans le processus d'appel Ainsi, vous ne pourrez jamais utiliser Jet directement depuis votre application en mode 64 bits. Comme Tim l'a mentionné, vous pouvez écrire votre propre analyseur csv, mais comme il s'agit d'une application rétractable, vous voulez quelque chose qui gérera un plus large éventail de formats. Heureusement, il existe un certain nombre de façons de parler des applications 32 bits, de sorte que vous pouvez toujours utiliser Jet avec un truc.

Je voudrais écrire un petit exe qui a été marqué pour fonctionner uniquement en mode 32 bits. Cet exe prendrait un argument de ligne de commande du nom du fichier à lire et le nom d'un fichier temporaire à écrire. J'utiliserais Jet pour charger le csv/xls, puis mettre les données dans un tableau de tableaux, et utiliser le sérialiseur xml pour écrire les données dans le fichier temporaire.

Puis, quand je dois charger/convertir un fichier CSV/fichier xls, je ferais ce qui suit:

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

J'aime cette option, elle garde les choses aussi propres que possible. Il est rare que vous ayez * besoin * d'exécuter x64 pour convertir un fichier plat en objet de données interne; Cependant, il est probable que vous souhaitiez profiter de x64 une fois que vous avez les données dans vos objets de données internes. – Nate

4

Vous pouvez essayer la bibliothèque FileHelpers pour votre analyse syntaxique fichier plat. Fonctionne incroyablement bien.

+0

Merci Christopher ... J'ai considéré FileHelpers, mais LGPL n'est toujours pas souhaitable d'inclure dans une base de code commerciale autant que je peux dire ... –

+0

Selon le code source FileHelpers pour gérer les fichiers Excel, il utilise AdoDB qui est limité aux applications 32 bits. Voir la fonction ExtractDataTable pour plus d'informations. –

+0

@AlexanderN Je ne vois pas le code source mais j'ai essayé avec une application 64 bits de lire un fichier Excel et cela fonctionne parfaitement. Le même problème avec mon propre ancien code en utilisant Ado jeter une exception. – Samuel

3

peut lire et écrire des classeurs .csv/.xls/.xlsx (et more) et prend en charge 64 bits .NET 2.0+. SpreadsheetGear peut être distribué gratuitement avec vos applications shrink wrap.

Vous n'avez pas spécifié si votre application est WinForms ou ASP.NET mais SpreadsheetGear fonctionne avec. Vous pouvez voir en direct ASP.NET (C# & VB) échantillons here, en apprendre davantage sur les échantillons WinForms here et télécharger un essai gratuit here si vous voulez l'essayer vous-même.

Disclaimer: Je possède SpreadsheetGear LLC

+0

Sons intéressants Joe. Merci! –

2

Ceci est plus un poste d'information pour toute personne qui pourrait être confronté à ce problème (et pour moi-même, je Incase ont le même problème à l'avenir et ne me souviens pas :-) solution) Il est un peu obscur, mais m'a fait quelques heures de stress, alors peut-être que ça va aider quelqu'un d'autre ... Désolé si cela est répété (ne pouvait pas le trouver) ou déprécié (certains n'ont pas le luxe du dernier et le plus grand).

Si vous essayez d'utiliser Jet 4.0 pour accéder à des documents MS Excel (ou à d'autres fichiers de données) sur un serveur x64, vous découvrirez que cette combinaison n'est pas prise en charge.

La seule solution est de permettre à IIS d'exécuter des applications 32 bits sous Windows 64 et d'installer un fournisseur db pris en charge.Vous devrez installer le pilote OLEDB 64 bits pour ODBC (MSDASQL) qui agit comme un pont: "Le fournisseur Microsoft OLE DB pour ODBC (MSDASQL) est une technologie qui permet aux applications sur OLEDB et ADO (qui utilise OLEDB en interne) pour accéder aux sources de données via un pilote ODBC MSDASQL est un fournisseur OLEDB qui se connecte à ODBC au lieu d'une base de données MSDASQL est livré avec le système d'exploitation Windows et Windows Server 2008 Windows Vista SP1 sont les premières versions de Windows à inclure une version 64 bits de la technologie. " Télécharger ici: http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

Tout cela fonctionne très bien, mais je suis tombé sur deux choses qui me avait me gratter la tête (et en insistant): 1) Vous devez autoriser ASP.Net 32 ​​bits dans IIS Web Service Extensions - Pour plus d'informations sur l'activation des applications 32 bits ET sur la configuration de l'extension du service Web IIS, consultez la section "" http://www.textcontrol.com/blog/permalink/2006082101 "". 2) Si vous utilisez des clés de registre sous IIS x64, un nouveau nœud sera ajouté dans le registre - Wow6432Node - dans lequel vous devrez déplacer/copier toutes les clés pertinentes utilisées sous x64. C'est-à-dire que nous avions une clé de données stockée dans HCLM \ Software \ CustomKey qui n'était plus disponible lorsque 32 bits était activé. Nous avons recréé la clé sous le Wow6432Node et tout était bien.

Questions connexes