我正在尝试使用带有“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=23734和http://www.microsoft.com/download/en/details.aspx?id=13255),但无济于事。
总结:
有什么想法吗?
答案 0 :(得分: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\"";
}
答案 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)
最后,一个解决方案!
基本上,你去
控制面板&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
为我工作