【问题标题】:Microsoft ACE OLEDB connection creating empty Excel when there are 166,110 rowsMicrosoft ACE OLEDB 连接在有 166,110 行时创建空 Excel
【发布时间】:2012-05-09 18:15:14
【问题描述】:

我正在使用 C# 编程并使用 oledbconnection。这是标准连接字符串,例如

using (OleDbConnection conn = new OleDbConnection(
          "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
           saveFilenameAndLocation + 
          ";Extended Properties='Excel 12.0 Xml;HDR=Yes'"
      ))  

当行数不过多时,这会成功运行并创建包含正确数据的 Excel 电子表格。但是,每当电子表格中的行数增加到很大时(例如,目前它在 166,110 行上失败),它会生成一个空的电子表格,其中工作表选项卡名称设置为 A266FF2A662E84b639DA

不可能重写它以使其不使用OLEDB 连接,任何想法为什么当行大小增加时它不起作用?

【问题讨论】:

    标签: c# excel oledb aceoledb


    【解决方案1】:

    我不确定您的应用程序环境,但我在从 ASP.NET 应用程序生成 Excel 文件时看到了这一点。

    一旦数据量超过一定大小(根据我的经验约为 1 MB),提供程序将在生成输出时尝试创建一个临时文件。我在 64 位系统上使用 32 位提供程序时遇到了这个问题。如果您在具有此配置的服务帐户下运行,则创建这些文件的位置是

    C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO
    

    但是,默认情况下,只有 administratorsSYSTEM 可以访问此位置,并且如果提供程序在 非特权帐户 下运行并且无法创建临时文件,则它将静默失败,并使用A266FF2A662E84b639DA 工作表返回其默认的“空文件”。

    您需要做的是授予运行在(例如网络服务或 IIS AppPool\)下的应用程序帐户沿路径“C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files”读取/执行/列出内容的权限,然后完全访问 @ 987654326@ 文件夹本身。

    如果提供程序与您系统的位数相匹配,那么我怀疑您需要为 C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO 执行上述过程,尽管我从未对此进行过测试。

    我要感谢 sysinternals 提供的 procmon 帮助我解决了这个问题。

    【讨论】:

    • 在谷歌上搜索了很久......这个答案为我提供了一个解决方案!
    • 注意:通常您不能在其属性中更改Temporary Internet Files 文件夹的权限。我为此使用了icaclsicacls "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files" /grant your_account_name:RX
    • 好吧,4 年后,ACE.OLEDB 仍然损坏 :-( 尝试在非标准位置创建临时文件是多么愚蠢。
    【解决方案2】:

    我公司的一位员工今天遇到了这个问题。解决方法很简单:她在 C: 上只剩下 20MB 可用空间 - 如果您在系统驱动器上释放足够的空间,它应该可以解决问题。

    【讨论】:

      【解决方案3】:

      Windows Server 2012R2 还要检查文件夹 INetCache 是否存在并且该文件夹是否具有完整权限 C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache

      【讨论】:

        【解决方案4】:

        10 小时后,我找到了解决方案。

        每 1000 行我们必须关闭并重新打开连接。

        样品在这里。

        string createTable = "Create Table [Sheet_X] (field1 char(255), field2 char(255),field3 char(255));";
        OleDbCommand cmd = new OleDbCommand(createTable, conn);
        conn.Open();
        cmd.ExecuteNonQuery();
        var counter = 0;
        foreach (var item in items)
        {
            if (conn.State == ConnectionState.Closed)
                conn.Open();
            string insertdata = "insert into [Sheet_X] (field1,field2,field3) values('value1','value2','value3');";
            counter++;
            if (counter >= 1000)
            {
                counter = 0;
                conn.Close();
            }
        }
        

        【讨论】:

          【解决方案5】:

          如果在尝试了以上所有解决方案后仍然不起作用,请尝试这个,它对我有用:

          在 IIS 应用程序池的“高级设置”中,将“Load User Profile”的值从“False”更改为“True”。

          【讨论】:

            猜你喜欢
            • 2011-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-22
            相关资源
            最近更新 更多