无法初始化OLE DB提供程序Microsoft.ACE.OLEDB.12.0的数据源对象,用于链接服务器(null)。

5
DECLARE @PATH NVARCHAR(1000) = N'\\MY-SERVER\C$\Folder\\'
DECLARE @TABLE NVARCHAR(50) = SUBSTRING(@FILENAME,0,CHARINDEX('.',@FILENAME))
DECLARE @SQL NVARCHAR(4000) = 
    N'IF OBJECT_ID(''dbo.' + @TABLE + ''' , ''U'') IS NOT NULL 
    DROP TABLE dbo.[' + @TABLE + ']
    SELECT * INTO [' + @TABLE + ']
    FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0''
                    ,''Text; Database='+@PATH+';''
                    ,''SELECT * FROM [' + @FILENAME + ']'')'

EXEC(@SQL)

今天我遇到了一个关于Microsoft.ACE.OLEDB.12.0 驱动程序在 SSIS 2012 中的问题。上面的脚本位于存储过程中,该存储过程根据由存储过程所在的 SSIS 循环提供的当前文件动态地将 .csv 文件加载到数据库中。目录中有一些文件。
当在 SQL Server Management Studio 直接运行存储过程时,存储过程可以正常运行。
这一直运行得很好,但今天出现了以下错误:
执行查询“EXEC [dbo].[CreateAndImportCSVs]?”失败,并显示以下错误:“无法初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象,用于链接服务器“(null)”。” 可能的故障原因:查询出现问题,“ResultSet”属性未正确设置,参数未正确设置,或连接未正确建立。
对此问题的任何帮助都将是非常好的!
编辑
所以查看了一下有什么变化,发现昨天安装了Windows更新!安装了以下两个项目:

微软办公室 Access 运行时和数据连通性 2007(SP3) http://support.microsoft.com/kb/2526310

2007 Microsoft Office 系统更新(KB967642) http://www.microsoft.com/downloads/details.aspx?FamilyId=E93AB1BE-ADE6-4FF8-8637-DBD3EBE3C5C5&displaylang=en


今天发生了什么变化?服务器故障转移/移动了吗?更改了密码?账户有所变动?发生了一些变化,让我们先确定是什么,然后再努力解决。 - billinkc
@billinkc 我已经在帖子中添加了一些额外的信息。 - AMouat
5个回答

2

2

许多尝试的事情:


  1. Check the In Process and Dynamic Provider options for the ACE provider
  2. Check the permissions on the Temp folder
  3. Check the MemToLeave memory area allocated
  4. Make sure the EXCEL process is not running in background
  5. Made sure 'ad hoc distributed queries' was enabled (1)

    USE [master]
    GO
    
    EXEC sp_configure 'Show Advanced Options', 1
    RECONFIGURE
    GO
    
    EXEC sp_configure 'Ad Hoc Distributed Queries', 1
    RECONFIGURE
    GO
    
    EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
    GO
    
    EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
    GO
    

请参考如何解决Microsoft.ACE.OLEDB.12.0错误“未指定错误”

同时,我在以下链接中发现了一个有趣的建议解决方案,请查看:


1
谢谢,1和2已经完成了,3不是问题,因为在SSMS中运行时成功运行。 - AMouat
检查 EXCEL 进程是否未运行,即使 Excel 应用程序未打开。 - Hadi
阅读最后一个链接。 - Hadi
1
很不幸,这些都无法解决问题。但是正如我在帖子中所说,当我直接从SSMS运行时,它可以正确运行,问题似乎出现在SSIS中。 - AMouat

1
"最终解决这个问题的关键是将电子表格移到SQL Server能够访问的Windows目录中。我将我的电子表格移动到了一个新的子目录中,该子目录位于我的SQL数据库所在的直接目录内,问题得到了解决。"

1

如果 Office 是 Click-to-Run 安装,SQL Server 就无法访问 Access 提供程序。

以下方法可解决此问题。

解决 OLEDB 驱动程序问题

解决方案

从 Microsoft 365 Apps for Enterprise Version 2009 开始,已经完成了将 ACE 从 C2R 虚拟化气泡中分离出来的工作,因此 Office 之外的应用程序可以定位 C2R 安装中提供的 Access 数据库引擎提供的 ODBC、OLEDB 和 DAO 接口。

使用以下表格了解在您的环境中是否需要其他组件才能访问这些接口: OLEDB driver issues


0

这可能不是一个解决方案,但你应该使用以下方式执行 SQL 语句:

sp_executesql @SQL

它可以防止注入和其他问题。


3
只有在使用参数化查询并提供参数时,sp_executesql 才能防止注入攻击。例如:EXECUTE sp_executesql N'SELECT * FROM AdventureWorksPDW2012.dbo.DimEmployee WHERE EmployeeKey = @level', N'@level tinyint', @level = 109;EXEC 相比,在这里没有任何特殊的优势,因为动态 SQL 使用变量来表示对象名称,而参数化查询无法实现这一点。 - Bacon Bits
也许你没有看到@filename未被声明。我理解为这是一个输入参数。 - n8.

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