【问题标题】:SQL Server 2012 querying Access 2007 data using OPENROWSET errorSQL Server 2012 使用 OPENROWSET 查询 Access 2007 数据错误
【发布时间】:2014-01-28 18:00:42
【问题描述】:

我想在 Management Studio 中从与我的 SQL Server 2012 实例位于同一台计算机上的 Microsoft Access 2007 数据库查询数据。我不想使用链接服务器来执行此操作,因为用户可以选择不同的 Access 数据库。我正在遵循technet 上的指示以及我读过的其他来源说使用OPENROWSET 作为做我想做的事情的正确方法,但是当我在 Management Studio 中执行此操作时......

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'C:\Users\oliver.klosoff\Desktop\New folder\41000-13-0085 Consolidated Killers LLC.mdb'; 'admin';'',tblTtlHrsFringes);

...我收到以下错误:

Msg 7302, Level 16, State 1, Line 1 Cannot create an instance of OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)".

数据库没有给admin用户设置密码,admin用户有读取这个表的权限。机器上安装了Access 2007 32bit,也就是64位,还有SQL Server实例。我相信 SQL Server 可以访问数据库文件,因为当我执行此操作时得到 1:

DECLARE @out INT
EXEC master.dbo.xp_fileexist 'C:\Users\oliver.klosoff\Desktop\New folder\41000-13-0085    Consolidated Killers LLC.mdb', @out OUTPUT
SELECT @out`

有没有办法做我想要完成的事情?

【问题讨论】:

    标签: sql-server ms-access sql-server-2012 ms-access-2007


    【解决方案1】:

    最后,在几次尝试让 SQL Server 与 Access 数据库“对话”(无论是作为 SSMS 中的“链接服务器”还是通过 T-SQL 中的OPENROWSET())都失败后,我发现this blog post 提供了以下三个(3) 建议。

    调整 #1:OLE DB 提供程序设置

    ACE(或 Jet)的 OLE DB 提供程序必须启用“动态参数”和“允许进程内”选项。在 SSMS 中,打开

    服务器对象>链接服务器>提供者

    分支,右键单击“Microsoft.ACE.OLEDB.12.0”(或“Microsoft.Jet.OLEDB.4.0”),选择“属性”,并确保选择了这些选项:

    调整 #2:临时文件夹权限

    这是困扰我的一个。

    显然 SQL Server 需要在对 Access 数据库运行 OLE DB 查询时将信息写入临时文件。由于 SQL Server 作为服务运行,因此它使用运行该服务的帐户的 %TEMP% 文件夹。

    如果 SQL Server 服务在内置的“网络服务”帐户下运行,则临时文件夹是

    %SystemRoot%\ServiceProfiles\NetworkService\AppData\Local\Temp

    如果它在内置的“本地服务”帐户下运行,那么临时文件夹是

    %SystemRoot%\ServiceProfiles\LocalService\AppData\Local\Temp

    我的问题是 SSMS 在 my 帐户(不是 NETWORK SERVICE)下运行,所以我只有 Temp 文件夹的读取权限

    一旦我授予自己对该文件夹的修改权限

    并启用 OPENROWSET 查询,如另一个问题 here 中所述,即 ...

    EXEC sp_configure 'show advanced options', 1
    RECONFIGURE
    GO
    EXEC sp_configure 'ad hoc distributed queries', 1
    RECONFIGURE
    GO
    

    ...我的查询运行良好:

    调整 #3:memory_to_reserve

    虽然在我的情况下不需要使用它,但上述博客也声称调整 SQL Server 服务的“-g memory_to_reserve”启动参数也可以帮助避免类似错误。为此:

    • 启动 SQL Server 配置管理器
    • 右键单击 SQL Server 服务(“SQL Server 服务”选项卡)并选择“属性”
    • 在“高级”选项卡上,将 -g512; 添加到“启动参数”设置中
    • 重启 SQL Server 服务

    有关“memory_to_reserve”设置的更多详细信息,请参阅 MSDN 文章 here

    【讨论】:

      【解决方案2】:

      这应该可以工作

      EXEC sp_configure 'show advanced options', 1;  
      GO  
      RECONFIGURE;  
      GO  
      EXEC sp_configure 'Ad Hoc Distributed Queries', 1;  
      GO  
      RECONFIGURE;  
      GO
      
      USE [DatabaseName]
      
      GO
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      
      SELECT *  FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0','Data Source="C:\Employees.accdb"')...tblEMPS;
      

      【讨论】:

        【解决方案3】:

        假设您已安装“Northwind”示例(并在下面提到的文件夹中),以下是否会运行?

        SELECT CustomerID, CompanyName
           FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
              'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
              'admin';'',Customers);
        GO
        

        很遗憾,自从上次重新映像后,我没有重新安装 SQL Server

        【讨论】:

          【解决方案4】:

          Microsoft.Jet.OLEDB.4.0 现在可能无法使用(2018 年)。需要将AccessDatabaseEngine_X64.exeAccessDatabaseEngine.exe 下载到SQL server 并安装。然后使用Microsoft.ACE.OLEDB.12.0

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多