19

我正在尝试使用带有“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 位的。

我还尝试重新安装 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”会将错误更改为“未指定错误”。(这是向前迈出的一步吗?!)

有什么想法吗?

4

10 回答 10

1
海我也面临这种情况我解决了它

解决了

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>
于 2014-09-17T09:03:29.520 回答
1

试试这个它可以帮助你:

设置path并按strFileType要求

      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\"";
    }
于 2014-01-30T09:42:33.410 回答
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]')
于 2019-08-22T13:56:50.730 回答
0

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

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

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

于 2012-04-27T18:16:58.713 回答
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$])
于 2013-02-26T17:01:05.383 回答
0

我已经解决了这个查询:

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

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

于 2013-05-29T08:02:36.853 回答
0

这对我有用:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
   'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$])
于 2017-07-18T11:27:13.600 回答
0

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

于 2018-07-11T17:53:09.247 回答
-2

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

NT Service\MSSQLSERVER
NT Service\SQLSERVERAGENT

为我工作

于 2018-07-30T18:08:00.790 回答