繁体   English   中英

链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”

[英]The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)"

我正在尝试运行以下语句,但收到下面的错误消息。 我研究了无休止的答案,但没有一个对我有用。 我正在运行 Office 365(64 位)。 我已经加载了 Microsoft Access 数据库引擎(64 位)。 这是在带有 SSDT 的 Visual Studio 2013 以及 SQL Server 2012 中。我无权访问 SQL Server 的更改环境或启动参数。 任何帮助表示赞赏。

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.15.0', 
    'Excel 12.0;Database=C:\Users\UserName\Folder\SomeFile.xlsx;;HDR=NO;IMEX=1', [Table 1$])
  • 消息 7399,级别 16,State 1,第 1 行链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.15.0”报告错误。 提供商没有提供有关错误的任何信息。
  • 消息 7303,级别 16,State 1,第 1 行无法初始化链接服务器“(空)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.15.0”的数据源 object。

这是我尝试过的:

首先,我跑...

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

其次是……没有爱。

EXEC sys.sp_addsrvrolemember @loginame = N'<<Domain\User>>', @rolename = N'sysadmin';
GO

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.15.0', N'AllowInProcess', 1 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.15.0', N'DynamicParameters', 1 
GO 

我已经将代码更改为读取Microsoft.ACE.OLEDB.12.0 ,因为我也看到了,仍然没有爱。

我还检查了 C:\Users\MSSQLSERVER\AppData\Local\Temp 和 C:Windows\ServiceProfiles\NetworkService\AppData\Local 的权限,它们已授予以下权限的完全控制权限:系统、MSSQLSERVER 和管理员、网络服务(在后者)。

还是没有爱。

最后,我尝试更改为 32 位版本的 Microsoft Access 数据库引擎,但一直无法正常工作。

帮忙,有人吗?

这是供我参考,因为我在尝试与提供程序连接时遇到了各种 SQL 错误消息。 其他答案规定“试试这个,然后这个,然后这个”。 我很欣赏其他答案,但我喜欢将特定解决方案与特定问题配对


错误

...提供者未提供信息...无法初始化数据源对象...

错误编号

7399、7303

错误详情

Msg 7399, Level 16, State 1, Line 2 The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" reported an error. 
  The provider did not give any information about the error. 
Msg 7303, Level 16, State 1, Line 2 Cannot initialize the data source object
  of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

解决方案

文件已打开。 关闭它。

信用


错误

访问被拒绝...无法获取列信息...

错误编号

7399, 73 50

错误详情

Msg 7399, Level 16, State 1, Line 2 The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" reported an error. 
  Access denied.
Msg 7350, Level 16, State 2, Line 2 Cannot get the column information 
  from OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

解决方案

授予访问权限

信用


错误

没有为一个或多个必需参数指定值....无法执行查询...

错误编号

??? , 73 20

错误详情

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "No value given for one or more required parameters.".
Msg 7320, Level 16, State 2, Line 2
Cannot execute the query "select [Col A], [Col A] FROM $Sheet" against OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)". 

解决方案

列名可能有误。 [Col A][Col B]真的存在于您的电子表格中?


错误

“未指定错误”...无法初始化数据源对象...

错误编号

??? , 7303

错误详情

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 2 Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

解决方案

以管理员身份运行 SSMS。 看到这个问题。


其他参考

其他建议修改属性的答案。 不确定修改这两个属性(选中或取消选中它们)会有什么帮助。

http://www.aspsnippets.com/Articles/The-OLE-DB-provider-Microsoft.Ace.OLEDB.12.0-for-linked-server-null.aspx

这解决了这个问题。 出于某种原因,SQL Server 不喜欢默认的 MSSQLSERVER 帐户。 将其切换到本地用户帐户可解决此问题。

我没有更改用户,而是找到了以下建议:

https://social.technet.microsoft.com/Forums/lync/en-US/bb2dc720-f8f9-4b93-b5d1-cfb4f8a8b1cb/the-ole-db-provider-microsoftaceoledb120-for-linked-server-null-reported- an-error-access?forum=sqldataaccess

这可能会帮助其他人 - 在尝试了所有解决方案以尝试并修复 SQL 64 上的此错误之后..

无法为链接服务器“(null)”初始化 OLE DB 访问接口“Microsoft.ACE.OLEDB.12.0”的数据源对象。

..我在这里找到了一篇文章...

http://sqlserverpedia.com/blog/sql-server-bloggers/too-many-bits/

..这建议我给予每个人对此文件夹的完全权限..

C:\\Users\\SQL 服务帐户名\\AppData\\Local\\Temp

嘿,快! 我的疑问突然迸发出来。 我欣喜若狂。

埃德瓦尔多

确保 Excel 文件未打开。

在 SQL Server 中,尝试以下步骤:

  1. 打开一个数据库。
  2. 单击选项Server Object
  3. 单击Linked Servers
  4. 单击Providers
  5. 右键单击Microsoft.ACE.OLEDB.12.0并单击Properties
  6. 取消选中所有选项并关闭。

以下是仅当被查询的 Excel 文件未打开以及以我的身份运行 SQL Server 服务时[作为有权访问文件系统的用户]时才对我有用的方法 我看到我的部分答案已经在其他地方给出,所以我为任何冗余道歉,但为了更简洁的答案:

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


SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                'Excel 12.0;Database=C:\MyExcelFile.xlsx',
                'SELECT * FROM [MyExcelSheetName$]')

我在 Windows 10 上运行SQL Server 2014 64 bit 。我尝试了所有方法,使其工作的原因是:

EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 0

我不知道为什么 AllowInProcess 关闭使它起作用,但这是我的情况的关键。 感谢您建议关闭链接服务器上的所有选项。

即使在运行您在每个答案/博客中看到的所有 EXEC 存储过程命令后,我也遇到了同样的问题,但是当我以管理员身份运行 SSMS 时,问题就消失了。 因为,我不想这样做,所以我打开服务,转到 SQL Server (MyServer),右键单击,选择属性。 在“登录”选项卡上,选择了“此帐户:”并列出了我的 SQL Server 帐户/密码。 我改为检查“本地系统帐户”并勾选“允许服务与桌面交互”。 然后我停止并启动服务。 现在,我可以运行与原始海报提到的相同的查询,而无需在 SSMS 中以管理员身份运行。 这可能有效,因为我在家庭桌面上运行 SQL Server。

我还想指出,您可以在 SSMS 中使用 GUI 来启用临时访问(以及许多其他选项)。 在 SSMS 中,转到链接服务器>提供程序,右键单击提供程序,然后选择属性。 然后你可以选中/取消选中你想要的。

在我们的例子中,它有助于为 SQL Server 服务添加一个参数:

  1. 转到Services.msc ,选择 SQL Server 服务并打开属性。
  2. 选择Startup Parameters并添加新参数–g512
  3. 重新启动 SQL 服务器服务。
  1. 关闭 SQL Server Management Studio。 在运行命令中键入 Services.msc 以打开服务窗口。

  2. 搜索 SQL Server 服务并右键单击它并选择属性。

  3. 在登录选项卡中,选择系统帐户/或选择您的域 ID 和帐户和密码。

  4. 找到您的登录名后,按“确定”。

  5. 现在在两个字段中输入您的登录密码。

  6. 重新启动服务,以便应用新的更改,如下图所示。

  7. 现在启动 SQL Server Management Studio 并尝试运行查询,如果仍然不起作用,请尝试重新启动系统。

...或执行以下查询:

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 

就我而言,发生此问题是因为我使用 computerName 从共享文件夹访问文件。 OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database='\\ntpc0100\\MysharedFolder\\KPI_tempData\\VariablePayoutDetails.xls';IMEX=1;'','.....) 插入使用 computerName ntpc0100(无论您的机器名称如何),您应该指定机器的 IP 地址。 例如:- OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0; Database='\\193.34.23.200\\MysharedFolder\\KPI_tempData\\KPIVariablePayoutDetails.xls'....);

对我来说,这两件事在不同的场合都有帮助:

1) 如果您刚刚安装了 MS Access 运行时,请重新启动服务器。 弹跳数据库实例是不够的。

2) 除了确保 Excel 文件未打开外,还要检查您是否在打开预览窗格的情况下打开了 Windows 资源管理器 - 这也将其锁定。

Exec sp_configure 'show advanced options', 1;
RECONFIGURE;
GO

Exec sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
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

Insert into OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0','Data Source=C:\upload_test.xlsx;Extended Properties=Excel 12.0')...[Sheet1$]
SELECT ColumnNames FROM Your_table -- Sheet Should be already Present along with headers

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 0;
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 0;
GO

Exec sp_configure 'Ad Hoc Distributed Queries', 0;
RECONFIGURE;
GO

Exec sp_configure 'show advanced options', 0
RECONFIGURE;
GO

在 SQL 2014 中,我将 SQL Server 服务 (MSSQL) 更改为作为LocalSystem运行。 这为我解决了这个问题。

根据我的记忆,它曾经在 2008 年作为NT_SERVICE\\MSSQL$MSSQL正常工作。

我收到了完全相同的错误消息,并尝试了此线程中建议的解决方案,但没有成功。

为我解决问题的是打开 .xlsx 文件并将其另存为 .xls (excel 2003) 文件。

也许文件已损坏或格式不同,再次保存即可修复。

这是我的错误代码:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine could not find the object 'ByStore$'. Make sure the object exists and that you spell its name and the path name correctly. If 'ByStore$' is not a local object, check your network connection or contact the server administrator.".

Msg 7350, Level 16, State 2, Procedure PeopleCounter_daily, Line 26

Cannot get the column information from OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

我的问题是路径中缺少 excel 文件。 只需将文件与正确的工作表一起放置即可。

对我来说,这是对文件文件夹的权限。 我必须为用户“所有人”添加所有权限。 文件夹/属性/安全 -> 添加用户所有人并设置所有权限。

在 SQL Server 2014 下调整 Excel 上的链接服务器时,我发现了两个关键的非显而易见的设置。使用这些设置, ' FROM OPENDATASOURCE(''Microsoft.ACE.OLEDB.16.0'', ...)'以及'... FROM [' + @srv_name + ']...data AS xl ...'功能正常。

创建链接服务器

这只是为了上下文。

DECLARE @DB_NAME NVARCHAR(30) = DB_NAME();
DECLARE @srv_name nvarchar(64) = N'<srv_base_name>@' + @DB_NAME; --to distinguish linked server usage by different databases

EXEC sp_addlinkedserver
    @server=@srv_name,
    @srvproduct=N'OLE DB Provider for ACE 16.0',
    @provider= N'Microsoft.ACE.OLEDB.16.0',
    @datasrc= '<local_file_path>\<excel_workbook_name>.xlsx',
    @provstr= N'Excel 12.0;HDR=YES;IMEX=0'
;
  1. @datasrc :编码在这里至关重要:varchar 而不是n varchar。
  2. @provstr :版本、设置和语法很重要!
  3. @provider :指定安装在 SQL Server 环境中的提供程序。 在 SSMS 的对象资源管理器中的Server Objects::Linked Servers::Providers下列举了可用的提供Server Objects::Linked Servers::Providers

在特定 SQL Server 登录名下提供对链接服务器的访问

这是第一个关键设置。 即使对于SA就像任何其他 SQL Server 登录:

EXEC sp_addlinkedsrvlogin @rmtsrvname = @srv_name, @locallogin = N'sa', @useself = N'False', @rmtuser = N'admin', @rmtpassword = N''
;
  1. @rmtuser :它应该是admin 实际上,同时在系统上登录的Windows 中没有任何admin
  2. @rmtpassword :它应该是一个空字符串。

通过即席查询提供对链接服务器的访问

这是第二个关键设置。 Ad Hoc Distributed Queries设置为 1 是不够的。 对于指定给@provider的驱动程序,应该将DisallowAdhocAccess注册表项显式设置为0

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.DEF_INST\Providers\Microsoft.ACE.OLEDB.16.0]
"DisallowAdhocAccess"=dword:00000000

对我而言,这两件事在不同场合有所帮助:

1)如果您刚刚安装了MS Access运行时,请重新启动服务器。 弹跳数据库实例还不够。

2)除了确保Excel文件未打开之外,还要检查预览窗格是否处于打开状态,请确保您没有打开Windows资源管理器-也将其锁定。 不要着急。

C:\\Users\\SQL Service account name\\AppData\\Local\\Temp删除只读复选框对我C:\\Users\\SQL Service account name\\AppData\\Local\\Temp

我遇到了同样的问题,原因是远程端的“此 Microsoft Office 副本未激活”。 (XLSX 从另一台机器链接)

为了将来参考,授予 SQL Server 服务帐户对“C:Windows\\ServiceProfiles\\NetworkService\\AppData\\Local\\Temp”的完全控制权为我解决了以下问题。

链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”返回消息“未指定错误”。

就我而言,问题出在第一行,标题中,我删除了该行并手动输入了字段名称。 可能的错误,隐藏字符

除了前面提到的错误编号组合之外,错误编号 7399 和 7303 可能意味着文件已打开并且文件甚至不是 Excel 文件。 所以请记住这一点。

出现错误的 3 件事 -文件已打开 -需要对共享文件夹进行完全读取/打开访问 -文件受密码保护。

文件名区分大小写 EG IMEX=1;Database=\FPTsite.mywebsite.com\E$\FTP\Folder1\FoldDer2\202202_MyFile.xlsx' 与 IMEX=1;Database=\FPTsite.mywebsite.com\ 不同E$\FTP\Folder1\FoldDer2\202202_myfile.xlsx'

我尝试了 Stackoverflow 中提到的所有选项。 但我仍然有同样的问题。 但它通过先插入表然后使用它来解决。

从:

select *  from OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
'Excel 8.0;Database=C:\Bharathi\Working\31012023_SSD\SSD.xlsx', 
'SELECT * FROM [Programs$]')

To:先插入临时表

 select * into #temp from OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database=C:\Bharathi\Working\18112022_Consoleforlob\data.xlsx',
'SELECT * FROM [Programs$]')

现在您可以使用#temp 表查看结果

Select * from #temp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM