【问题标题】:How to resolve "Could not find installable ISAM." error for OLE DB provider "Microsoft.ACE.OLEDB.12.0"如何解决“找不到可安装的 ISAM”。 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的错误
【发布时间】:2012-02-06 13:14:56
【问题描述】:

我正在尝试使用带有“Microsoft.ACE.OLEDB.12.0”OLE DB 提供程序的 T-SQL OpenRowset() 命令将 Excel 2007 (.xlsx) 文件中的数据导入 SQL Server 2008,我得到了持续的“找不到可安装的 ISAM”错误。所有硬件都是 32 位的。

[2012 年 1 月 10 日修订,以更清晰地关注异常]

以下 T-SQL 语句产生错误:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"',
    'SELECT * FROM [Sheet1$]'
)

如果我将 Excel 文件保存为“Excel 97-2003”格式 (.xls) 并使用较旧的 Microsoft.Jet.OLEDB.4.0 提供程序导入数据,它就可以正常工作。这让我觉得这不是安全或其他环境问题。

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES', 
    'SELECT * FROM [Sheet1$]'
)

但是,当我尝试使用 Microsoft.ACE.OLEDB.12.0 提供程序(应该向后兼容 *.xls 格式)的 *.xls 文件时,它再次失败并出现相同的错误:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";', 
    'SELECT * FROM [Sheet1$]'
)

另外,有趣的是,当我使用 SSMS“导入数据...”向导时,它工作正常。我将导入数据向导输出保存为 SSIS 包,并查看了 SSIS 文件以试图弄清楚它是如何工作的,并且它成功地使用了 Microsoft.ACE.OLEDB.12.0 提供程序。这是来自 SSIS 包的连接字符串:

<DTS:Property DTS:Name="ConnectionString">
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES";
</DTS:Property>

我还完成了相关的 SQL Server 配置以允许 OPENROWSET 分布式查询:

sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO

如果我还设置了以下 *sp_MSset_oledb_prop* 值(我在某处的帖子中找到)...

USE [master] 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 
GO 

...然后错误变为“未指定的错误”:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

但是,我不确定这是上游错误还是下游错误。 (现在是否找到“可安装的 ISAM”但随后失败?)

我已经在两台不同的机器/操作系统(Windows Server 2003、Windows XP SP3)上使用多个 Excel 文件进行了尝试。两台机器都是 32 位的。

我还尝试重新安装 Office 2007 和 Office 2010 版本的 AccessDatabaseEngine.exe(分别为http://www.microsoft.com/download/en/details.aspx?id=23734http://www.microsoft.com/download/en/details.aspx?id=13255),但无济于事。

总结一下:

  • “Microsoft.Jet.OLEDB.4.0”提供程序使用 T-SQL 工作,但“Microsoft.ACE.OLEDB.12.0”不能。
  • “Microsoft.ACE.OLEDB.12.0”使用“导入数据...”向导工作(据我从保存的 SSIS 作业文件中得知)。
  • 将“AllowInProcess”和“DynamicParameters”属性设置为“1”会将错误更改为“未指定错误”。 (这是向前迈出的一步吗?!)

有什么想法吗?

【问题讨论】:

  • 你搜索过这个eeor吗?有很多问题问它,大多数答案似乎都围绕在您的 Data Source=' ... ' 周围添加引号
  • 是的,我花了几个小时搜索 SO 和其他地方,并尝试了连接字符串的许多变体,包括使用引号,所以我认为这不是问题。 (这包括复制正在工作的 SSIS 连接字符串。)
  • 我设法解决类似问题的唯一方法是使用 MDW 文件。见here
  • 有趣!感谢您的评论...希望对其他人有用。我没有机会重新测试我采取了不同的方法,该项目现在已经过时了。

标签: tsql excel-2007 oledb openrowset isam


【解决方案1】:

这对我有用

Select *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
                'text;
                 HDR=yes;
                 imex=1;
                 driver={Microsoft text Driver (*.xls, *.xlsx, *.xlsm, *.xlsb,*.csv)}; 
                 extended properties=excel 12.0 xml; 
                 Database=<path>\', 
                'SELECT * from [<filename>#csv]')

【讨论】:

    【解决方案2】:

    如果您完成所有这些帖子并继续出现错误。 尝试将文件夹 pdf 上的权限分配给帐户

    NT Service\MSSQLSERVER
    NT Service\SQLSERVERAGENT
    

    为我工作

    【讨论】:

      【解决方案3】:

      确保对连接字符串的扩展属性部分的引用为我修复了它。我添加了一个额外的属性,并且在我的新属性之后没有将报价迁移到末尾。

      【讨论】:

        【解决方案4】:

        这对我有用:

        SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
           'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$])
        

        【讨论】:

          【解决方案5】:
          海我也面临这种情况我解决了它

          解决了

          string ConeectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFlp.Text 
          
              + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"");
          
                          OleDbConnection oconn = new OleDbConnection(ConeectionString);</b>
          

          【讨论】:

          【解决方案6】:

          终于,一个解决方案!

          看看这个:Msg 7302, Level 16, State 1, Line 1 Cannot create an instance of OLE DB Provider “Microsoft.ACE.OLEDB.12.0” for linked server “(null)”

          基本上,你去

          控制面板 > 管理工具 > 组件服务

          然后展开

          组件服务 > 计算机 > 我的电脑 > DCOM 配置

          找到

          MSDANITIALIZE

          属性 > 安全 > 启动和激活权限

          点击

          自定义 > 编辑...

          如果您愿意,请添加您的登录名或“所有人”

          为新用户/组勾选所有“允许”框

          在两个页面上都点击确定

          现在看看你的 OpenRowSet / OpenDataSource 命令是否有效

          感谢Ramesh Babu Vavilla (vr.babu) from social.technet.microsoft.com提供链接

          【讨论】:

          • “启动和激活权限”中的所有控件都被禁用。
          • @Irawan 您需要以管理员身份登录 Windows 才能访问这些设置。向您的域管理员请求访问权限。
          • 我这样做了,现在我不再收到 7303 或 7399 错误,但我的查询只是卡在“正在执行的查询”并且永远不会完成。如果我尝试取消查询,它会卡在“取消查询”上并且永远不会取消。我必须重新启动我的机器或强行关闭 SSMS 才能让它停止......所以肯定发生了一些变化,但它仍然无法正常工作。在 12.0 和 16.0 上进行了尝试,有很多选项。
          【解决方案7】:

          试试这个可能对你有帮助:

          根据需要设置pathstrFileType

                string connString = "";
          //    string strFileType = Path.GetExtension(UpfileName.FileName).ToLower();
          //    string path = UpfileName.PostedFile.FileName;
          
          if (strFileType.Trim() == ".xls")
             {
          
                connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
             }
             else if(strFileType.Trim() == ".xlsx")
              {
                      connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
              }
          

          【讨论】:

          • 在扩展属性中添加引号对我有用(例如 "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0;HDR=是的;\"";)
          【解决方案8】:

          我已经解决了这个问题:

          SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
              'Excel 12.0;HDR=NO;Database=D:\Filename.xlsx;', 
              [SheetName$])
          

          似乎 sql 不喜欢“扩展属性”部分...

          【讨论】:

            【解决方案9】:

            试试这个

            SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                            'EXCEL 12.0;DataBase=C:\TEMP\test.xlsx;Extended Properties="EXCEL 12.0 Xml;HDR=YES', [Sheet1$])
            

            【讨论】:

              【解决方案10】:

              我认为答案隐藏在您发布的 SSIS 包信息中。新的文件格式 xlsx,以 XML 格式而不是旧格式存储数据。再看一遍。它读... 扩展属性="Excel 12.0 XML;HDR=YES

              不要错过标准内容之后的 XML。 (对于它的价值,我还读到您需要“Excel 12.0 宏”来连接 xslm 文件。)

              试一试。很奇怪,但希望它有效。

              【讨论】:

              • 上面的第一个代码 sn-p 包含您建议的Extended Properties="Excel 12.0 XML;HDR=YES" - 仍然不起作用。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-03-18
              • 2010-10-05
              • 2016-09-15
              • 1970-01-01
              • 2013-06-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多