我正在尝试使用带有“ Microsoft.ACE.OLEDB.12.0” OLE DB访问接口的T-SQL OpenRowset()命令将数据从Excel 2007(.xlsx)文件导入到SQL Server 2008中,并且得到了持久的“找不到可安装的ISAM”错误。所有硬件均为32位。

[修订12年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位的。

我也尝试过重新安装Access DatabaseEngine.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”会将错误更改为“未指定错误”。 (这是前进的一步吗?!)


有什么想法吗?

最佳答案

尝试此操作可能会帮助您:

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

09-10 03:12
查看更多