如何解决“无法找到可安装的ISAM”。 OLE DB提供程序“Microsoft.ACE.OLEDB.12.0”的错误

时间:2012-01-10 02:48:58

标签: tsql excel-2007 oledb openrowset isam

我正在尝试使用带有“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 97-2003”格式(.xls)保存Excel文件并使用较旧的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”会将错误更改为“未指定的错误”。 (这是向前迈出的一步吗?!)

有什么想法吗?

10 个答案:

答案 0 :(得分: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 :(得分:0)

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

在标准内容之后不要错过XML。 (对于它的价值,我还读到你需要&#34; Excel 12.0宏&#34;连接xslm文件。)

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

答案 2 :(得分: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$])

答案 3 :(得分:0)

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

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

看来sql不喜欢“扩展属性”部分......

答案 4 :(得分:0)

最后,一个解决方案!

检查出来: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)”

基本上,你去

  

控制面板&gt;管理工具&gt;组件服务

然后展开

  

组件服务&gt;电脑&gt;我的电脑&gt; DCOM配置

查找

  

MSDAINITIALIZE

转到

  

属性&gt;安全&gt;启动和激活权限

点击

  

自定义&gt;编辑...

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

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

并在两个页面上点击

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

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

答案 5 :(得分: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>

答案 6 :(得分:0)

这对我有用:

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

答案 7 :(得分:0)

确保连接字符串的扩展属性部分周围的引用对我而言固定。我添加了一个附加属性,并且没有将引号移到新属性后面。

答案 8 :(得分:0)

这对我有用

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

答案 9 :(得分:-2)

如果您执行了所有这些操作,然后继续出现错误。 尝试将pdf文件夹上的permisiton分配给帐户

NT Service\MSSQLSERVER
NT Service\SQLSERVERAGENT

为我工作