在64位模式下不支持OleDB?

我一直在使用Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0来读取.csv,.xls和.xlsx文件。

我刚刚发现原生64位模式都不支持这些技术!

我有两个问题:

  1. 在64位模式下以编程方式读取.csv,.xls和.xlsx文件的支持方式是什么。 我无法在任何地方找到答案。

  2. 如果我无法读取所有三种文件类型,那么在64位环境中读取.csv文件的最佳方法是什么?

笔记:

  • 我正在使用.NET(3.5p1)
  • 这是一个收缩包装应用程序; 再分配是一个关键因素。

更新:

我可以使用CorFlags强制应用程序在32位模式下运行,这是有效的,但是不可取。

下面讨论如何处理已弃用的MDAC 。 我担心答案不是很令人满意……

这些新的或转换后的Jet应用程序可以继续使用Jet,目的是使用Microsoft Office 2003和早期文件(.mdb和.xls)进行非主数据存储。 但是,对于这些应用程序,您应该计划从Jet迁移到2007 Office System驱动程序。 您可以下载2007 Office System驱动程序,它允许您读取和写入Office 2003(.mdb和.xls)或Office 2007中的预先存在的文件(* .accdb,* .xlsm,* .xlsx和* .xlsb)文件格式。 重要信息请阅读2007 Office System最终用户许可协议,了解具体的使用限制。

注意:SQL Server应用程序还可以通过2007 Office System Driver从SQL Server异构数据连接和集成服务function访问2007 Office System及更早版本的文件。 此外,64位SQL Server应用程序可以通过在64位Windows上使用32位SQL Server Integration Services(SSIS)来访问32位Jet和2007 Office System文件。

主要问题是Jet DBMS是一个32位的库,它被加载到调用进程中,所以你永远无法在64位模式下直接在你的应用程序中使用Jet。 Tim提到你可以编写自己的csv解析器,但由于这是一个收缩包装应用程序,你需要能够处理更多格式的东西。 幸运的是,有很多方法可以讨论32位应用程序,所以你仍然可以使用Jet技巧。

我会写一个标记为仅在32位模式下运行的exe。 此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); } } 

您可以尝试使用FileHelpers库进行平面文件解析。 工作得非常好。

SpreadsheetGear for .NET可以读写.csv / .xls / .xlsx工作簿(以及更多 )并支持64位.NET 2.0+。 SpreadsheetGear可以通过收缩包装应用程序免费分发。

您没有指定您的应用程序是WinForms还是ASP.NET,但SpreadsheetGear可以使用它们。 您可以在此处查看实时ASP.NET(C#和VB)示例, 在此处了解WinForms示例并在此处下载免费试用版,如果您想自己尝试一下。

免责声明:我拥有SpreadsheetGear LLC

您可以使用Microsoft Access数据库引擎2010 Redistributable读取和写入csv,xls访问等。每个驱动程序有32位和64位版本。

对于任何可能遇到此问题的人来说,这都是一个信息性的post(对于我自己来说,我将来会遇到同样的问题并且不记得解决方案:-))这有点模糊,但却给我带来了几个小时的压力,也许它会帮助别人…对不起,如果这是重复(找不到)或弃用(有些没有最新和最好的奢侈品)。

如果您尝试使用Jet 4.0访问基于x64的服务器上的MS Excel文档(或其他数据文件),您将发现不支持此组合。

唯一的解决方案是允许IIS在Windows 64上运行32位应用程序并安装受支持的数据库提供程序。

您需要安装驱动程序,用作ODBC的64位OLEDB提供程序(MSDASQL)作为桥梁:“用于ODBC的Microsoft OLE DB提供程序(MSDASQL)是一种允许基于OLEDB和ADO构建的应用程序的技术(它通过ODBC驱动程序访问数据源.MSDASQL是连接到ODBC而不是数据库的OLEDB提供程序.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)你需要在IIS Web服务扩展中允许32位ASP.Net – 阅读“” http://www.textcontrol .com / blog / permalink / 2006082101 “”有关启用32位应用程序和IIS Web服务扩展设置的说明。 2)如果您在IIS x64下使用任何注册表项,将在注册表中添加一个新节点 – Wow6432Node – 您需要移动/复制x64下使用的任何相关密钥。 即我们有一个存储在HCLM \ Software \ CustomKey中的数据密钥,当启用32位时,该密钥不再可用。 我们在Wow6432Node下重新创建了密钥,一切都很好。

实际上我认为Linq是你最好的解决方案。

就像是….

 IEnumerable ObjList = GetObjList(yourCSVFileNAme); var qry = from o in ObjList where o.MyField == Something select o; 

你的GetObjList方法看起来像

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