【问题标题】:The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)"链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”
【发布时间】:2022-04-20 06:18:07
【问题描述】:

我正在尝试运行以下语句,但收到下面的错误消息。我研究了无止境的答案,但没有一个对我有用。我正在运行 Office 365(64 位)。我已经加载了 Microsoft Access 数据库引擎(64 位)。这是在带有 SSDT 以及 SQL Server 2012 的 Visual Studio 2013 中。我无权更改 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,状态 1,第 1 行 OLE DB 提供程序 链接服务器“(null)”的“Microsoft.ACE.OLEDB.15.0”报告了一个 错误。提供者没有提供有关错误的任何信息。
  • 消息 7303,级别 16,状态 1,行 1 无法初始化数据源 用于链接的 OLE DB 提供程序“Microsoft.ACE.OLEDB.15.0”的对象 服务器“(空)”。

这是我尝试过的:

首先,我跑了……

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 数据库引擎,但一直无法正常工作。

帮忙,有人吗?

【问题讨论】:

  • 为了好玩,试试Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\UserName\Folder\SomeFile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=NO;" 我一直在使用它和 ADODB 来查找 excel 2007 和 2010 文件,并且很幸运。
  • 您能演示一下如何将这一行合并到我上面的 SELECT 语句中吗?如果不以某种方式反对格式,我将无法完全理解它。谢谢!
  • 这可能有效。我不熟悉 Visual Studio 中的 OPENROWSET 语法,但我一直使用 ADODB 库。 SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Source=C:\Users\UserName\Folder\SomeFile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=NO;"', [Table 1$])
  • 在我的情况下,它可以使用“sa”帐户连接到 Sql 服务器。每次我从 Sql 服务器打开 excel 文件时,我都需要连接“sa”帐户。不是windows帐户。特别是在我的情况下,我在报表设计器中有一个报表。我必须在解决方案资源管理器中进入“共享数据源”,打开带有连接的 rds 文件。在那里我打开了“凭据”选项卡并使用“sa”帐户进行了修改。

标签: sql visual-studio-2013 openrowset


【解决方案1】:

这是供我参考的,因为我在尝试与提供程序连接时遇到了各种 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、7350

错误详情

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)".

解决方案

授予访问权限

信用


错误

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

错误编号

???,7320

错误详情

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。见this question.


其他参考资料

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您应该在答案中添加相关代码,而不是简单地共享链接。
    • 对我来说恰恰相反。 SQL Server 实例最初是在我的凭据下运行的(在我的开发机器上),无论我如何调整安全角色或文件权限,我都无法克服这个错误。一旦我恢复登录方式以使服务作为本地系统运行,错误就停止了。
    • 嘿,看那个。 11 个月前我在这里(从我上次评论的时间戳开始)。这次发生的事情是我们的网站作为网络服务运行(IIS 应用程序池标识和数据库登录),但 SQL Server 实例在本地计算机帐户下运行。解决方法是授予应用程序池 ID(网络服务)对 SQL 服务帐户(本地计算机)临时文件夹的写入权限。请参阅@Michael Møldrup 的帖子。
    • 如果你是这个Windows系统的管理员,你也可以设置选择Local System account。这样您就不必担心更改密码。效果很好!感谢您的提示!
    【解决方案3】:

    我发现了这个建议,而不是更改用户:

    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 上修复此错误..

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

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

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

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

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

    嘿,快!我的疑问突然变得生动起来。我打了空气 高兴。

    爱德华多

    【讨论】:

    • “那是我听到天使唱歌的时候。” (有约翰·皮内特的粉丝吗?)一年多来一直在努力解决这个问题。对我们来说,它是服务器的 c$\Users\MSSQL$SQL2012\AppData\Local\Temp 文件夹。右键单击文件夹,属性,安全,高级,权限,更改权限,添加,输入“所有人”,检查名称,好的,允许完全控制。
    【解决方案4】:

    确保 Excel 文件未打开。

    【讨论】:

    • 值得更多 +1 !!!
    【解决方案5】:

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

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

    【讨论】:

      【解决方案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$]')
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 您的回答拯救了我的一天。我在这个烂摊子中被困了大约 2 个小时,直到我明白了你的意思。
        【解决方案8】:

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

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

        我不知道为什么关闭 AllowInProcess 会使其工作,但这是我案例的关键。感谢您关闭链接服务器上的所有选项的建议。

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              在 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 而不是 nvarchar。
              2. @provstr:版本、设置和语法很重要!
              3. @provider:指定安装在您的 SQL Server 环境中的提供程序。可用的提供程序在 SSMS 的对象资源管理器中的 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 是不够的。 应将DisallowAdhocAccess 注册表项显式设置为0,以便为指定为@provider 的驱动程序显式设置:

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

              【讨论】:

                【解决方案12】:
                1. 关闭 SQL Server Management Studio。在运行命令中输入 Services.msc 以打开服务窗口。

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

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

                4. 一旦找到您的登录名,请按 OK。

                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 
                

                【讨论】:

                • 我认为值得注意的是,建议的解决方案要求您具有超级管理员角色才能进行这些更改以执行查询错误消息:消息 15003,级别 16,状态 1,过程 sp_MSset_oledb_prop,第 11 行只有 setupadmin 角色的成员才能执行此存储过程。
                【解决方案13】:

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

                1. 转到Services.msc,选择SQL Server 服务 并打开属性。
                2. 选择Startup Parameters并添加新的 参数–g512
                3. 重新启动 SQL 服务器服务。

                【讨论】:

                • 这是什么-g512?
                【解决方案14】:

                在我的情况下,出现此问题是因为我使用 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'....);

                【讨论】:

                  【解决方案15】:

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

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

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

                  【讨论】:

                    【解决方案16】:
                    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
                    

                    【讨论】:

                      【解决方案17】:

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

                      据我记得,它在 2008 年之前还可以使用 NT_SERVICE\MSSQL$MSSQL

                      【讨论】:

                        【解决方案18】:

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

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

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

                        【讨论】:

                          【解决方案19】:

                          这是我的错误代码:

                          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 文件。只需将文件放入正确的表格即可。

                          【讨论】:

                            【解决方案20】:

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

                            【讨论】:

                              【解决方案21】:

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

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

                              【讨论】:

                                【解决方案22】:

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

                                【讨论】:

                                【解决方案23】:

                                导致错误的 3 件事 - 文件已打开 -需要对共享过滤器的完全读取/打开访问权限 - 文件受密码保护。

                                文件名区分大小写 例如。 IMEX=1;数据库=\FPTsite.mywebsite.com\E$\FTP\Folder1\FoldDer2\202202_MyFile.xlsx' 不一样 IMEX=1;Database=\FPTsite.mywebsite.com\E$\FTP\Folder1\FoldDer2\202202_myfile.xlsx'

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2013-06-03
                                  • 2016-09-15
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2018-05-14
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多