如何解决“找不到可安装的 ISAM”错误,针对 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”

22
我正在尝试使用T-SQL OpenRowset()命令和"Microsoft.ACE.OLEDB.12.0" OLE DB提供程序,从Excel 2007 (.xlsx)文件中导入数据到SQL Server 2008,但是我一直遇到"找不到可安装的ISAM"错误。所有硬件均为32位。 [已于1/10/12进行修订,以更加准确地聚焦异常情况] 以下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$]'
)

然而,当我尝试使用应该与*.xls格式向后兼容的Microsoft.ACE.OLEDB.12.0提供程序打开*.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”但随后失败了?)
我已经尝试过多个Excel文件,并在两台不同的机器/操作系统(Windows Server 2003、Windows XP SP3)上进行了测试。两台机器都是32位的。
我还尝试重新安装AccessDatabaseEngine.exe的Office 2007和Office 2010版本(分别为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”会将错误更改为“未指定错误”。(那是一步向前吗?!)

有什么想法吗?


你在 Stack Overflow 上搜索过这个错误吗?有很多问题在询问它,大多数答案似乎都围绕着在 Data Source=' ... ' 周围添加引号。 - chris neilsen
是的,我花了几个小时在SO和其他地方搜索,并尝试了许多连接字符串的变化,包括引号的使用,所以我不认为这是问题所在。(这包括复制可用的SSIS连接字符串。) - Martin_W
我解决类似问题的唯一方法是使用MDW文件。请参见此处 - itsho
有趣!感谢您的评论...希望对其他人有用。我没有重新测试的机会,我采取了不同的方法,这个项目现在已经过时了。 - Martin_W
10个回答

1

终于找到解决方法了!

看这里: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 配置

找到

MSDAINITIALIZE

进入

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

点击

自定义 > 编辑...

如果您愿意,可以添加您的登录名或“Everyone”

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

并在两个页面上点击“确定”

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

感谢来自social.technet.microsoft.com的Ramesh Babu Vavilla (vr.babu)的链接


1
“启动和激活权限”中的所有控件都被禁用了。” - Irawan Soetomo
2
@Irawan 你需要以管理员身份登录Windows才能访问这些设置。请向您的域管理员请求访问权限。 - Hamid Sadeghian
我已经做了这个,现在不再出现7303或7399错误,但我的查询卡在“执行查询”处,永远无法完成。如果我尝试取消查询,它会卡在“取消查询”上,永远无法取消。我必须重新启动我的机器或强制关闭SSMS才能停止它...所以肯定有些东西改变了,但它仍然不起作用。在12.0和16.0上尝试了很多选项。 - Geoff Griswald

1

尝试这个,它可能会帮助你:

根据需求设置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\"";
    }

1
在我的情况下,为扩展属性添加引号起作用了 (像这样 "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties="Excel 12.0;HDR=YES;"";) - pawciu

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]')

0

确保在连接字符串的扩展属性部分周围加上引号,这对我很有帮助。我添加了一个额外的属性,但没有将引号迁移到我的新属性之后。


0
我也遇到过这种情况,我解决了它。
已解决。
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>

我将“Excel12.0”更改为“Excel 12.0 Xml”,因为它与我在这里找到的内容相符:https://dev59.com/Um_Xa4cB1Zd3GeqP4LQU而且这对我也起作用了。谢谢! - PopeDarren

0

试一下

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$])

-1

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

不要错过标准内容后面的XML。(值得一提的是,我也读到你需要“Excel 12.0 Macro”才能连接xslm文件。)

试试看。虽然很奇怪,但希望能起作用。


2
上面的第一段代码包括了你建议的 Extended Properties="Excel 12.0 XML;HDR=YES",但仍然无法工作。 - Martin_W

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

-1

我已经通过这个查询解决了问题:

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

看起来 SQL 不喜欢 "Extended Properties" 部分...


-2
如果您完成了所有这些步骤,但仍然出现错误,请尝试将文件夹pdf的权限分配给该账户。
NT Service\MSSQLSERVER
NT Service\SQLSERVERAGENT

对我来说可行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接