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

时间:2017-11-30 16:50:25

标签: sql-server ssis etl ssis-2012 ms-jet-ace

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)

今天我在SSIS 2012中遇到了Microsoft.ACE.OLEDB.12.0驱动程序的问题。上面的脚本位于一个存储过程中,该存储过程根据当前文件将.csv动态加载到数据库中。存储过程所在的SSIS循环。目录中有文件。

直接在SQL Server Management Studio中运行时,存储过程可以正常运行。

直到今天,这一直很好。今天我收到以下错误:

  

执行查询“EXEC [dbo]。[CreateAndImportCSVs]?”失败,出现以下错误:“无法初始化OLE DB提供程序的数据源对象”Microsoft.ACE.OLEDB.12.0“链接服务器”(null)“。”。   可能的故障原因:查询问题,“ResultSet”属性设置不正确,参数设置不正确或连接未正确建立。

对这个问题的任何帮助都会很棒!

修改

因此,当我查看昨天安装在服务器上的Windows更新时,我会看到发生了什么变化!安装了以下两个:

Microsoft Office Access运行时和数据连接2007(SP3) http://support.microsoft.com/kb/2526310

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

4 个答案:

答案 0 :(得分:2)

要尝试的很多事情:

  1. 检查ACE提供程序的In Process和Dynamic Provider选项
  2. 检查Temp文件夹的权限
  3. 检查分配的MemToLeave内存区域
  4. 确保pressures = [log(record['air_pressure']) for record in data] 进程未在后台运行
  5. 确保'临时分布式查询'已启用(1)

    EXCEL
  6. How to solve Microsoft.ACE.OLEDB.12.0 error "Unspecified error"

    了解详情

    此外,我在以下链接中找到了一个有趣的建议解决方案,请看一下:

答案 1 :(得分:2)

此问题自行解决。安装了进一步的更新,其中一个必须修复先前更新引入的问题:

Microsoft Office 2010更新(KB4011188)64位版 https://support.microsoft.com/kb/4011188

Microsoft Office 2010更新(KB2553347)64位版 http://support.microsoft.com/kb/2553347

Microsoft Office 2010安全更新(KB2553338)64位版 https://support.microsoft.com/kb/2553338

感谢您的帮助!

答案 2 :(得分:1)

为我解决这个问题的最后一块是将电子表格移动到 SQL Server 能够访问的 Windows 目录。我将我的电子表格移动到了一个新的子目录,在我的 sql 数据库所在的直接位置,问题解决了。

答案 3 :(得分:0)

可能不是解决方案,但你应该用:

执行SQL
sp_executesql @SQL

它可以防止注射和伤害。