在64位模式下不支持OleDB?

时间:2009-05-14 00:07:18

标签: c# .net csv 64-bit oledb

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

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

我有两个问题:

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

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

  3. 注意:

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

    更新

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

7 个答案:

答案 0 :(得分:8)

以下是对about deprecated MDAC做什么的讨论。我担心答案不是很令人满意......

  

这些新的或转换过的Jet   应用程序可以继续使用Jet   打算使用微软   Office 2003和早期文件(.mdb   和.xls)非主要数据   存储。但是,对于这些   应用程序,你应该计划   从Jet迁移到2007 Office   系统驱动程序你可以下载   2007 Office System Driver,其中   允许您读取和写入   Office中预先存在的文件   2003(.mdb和.xls)或Office   2007(* .accdb,* .xlsm,* .xlsx和   * .xlsb)文件格式。重要信息请阅读2007 Office System最终用户   特定用途的许可协议   限制。

     

注意:SQL Server应用程序也可以   访问2007 Office System,和   较早,来自SQL Server的文件   异构数据连接和   集成服务功能   好吧,通过2007 Office System   驱动程序。另外,64位SQL   服务器应用程序可以访问   32位Jet和2007 Office System   使用32位SQL Server的文件   64位上的Integration Services(SSIS)   视窗。

答案 1 :(得分:4)

主要问题是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);
    }
}

答案 2 :(得分:4)

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

答案 3 :(得分:4)

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

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

免责声明:我拥有SpreadsheetGear LLC

答案 4 :(得分:3)

您可以使用Microsoft Access Database Engine 2010 Redistributable来读取和写入csv,xls访问等。每个驱动程序都有32位和64位版本。

答案 5 :(得分:3)

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

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

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

您需要安装驱动程序,用作ODBC的64位OLEDB提供程序(MSDASQL): “用于ODBC的Microsoft OLE DB提供程序(MSDASQL)是一种允许基于OLEDB和ADO(内部使用OLEDB)构建的应用程序通过ODBC驱动程序访问数据源的技术.MSDASQL是连接到ODBC的OLEDB提供程序,而不是数据库.MSDASQL附带Windows操作系统,Windows Server 2008和Windows Vista SP1是第一个包含该技术的64位版本的Windows版本。“ 在此下载: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下重新创建了密钥,一切都很好。

答案 6 :(得分:1)

实际上我认为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;
  }
}