【问题标题】:OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Bookmark is invalid."链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”返回消息“书签无效。”
【发布时间】:2016-02-15 23:47:59
【问题描述】:

我想从 Excel 中导出 MSSQL SERVER 2008 中的数据,但出现错误

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" 
returned message "Bookmark is invalid.".

Msg 7343, Level 16, State 2, Line 1

The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" 
could not INSERT INTO table "[Microsoft.ACE.OLEDB.12.0]". 

导出时是我的 excel 文件(文件保存为 97-2003 格式)

这是我的查询

请告诉我为什么会出错?我需要做什么?

【问题讨论】:

  • 请勿发布代码截图。贴出代码。您已标记此php,请说明 PHP 是如何参与的。
  • 第一 - 为什么我不能发布图片?第二 - 你在哪里看到 php 标签?
  • 您可以发布图片,但您不应该发布文字图片。文字就是文字。文字不是图像。从图像中读取文本是一项挑战,而挑战会阻碍获得帮助。另外,你应该知道编辑是公共记录,所以假装不知道问题中以前存在的东西,比如 PHP 标签,会让你看起来很傻

标签: sql-server-2008 export-to-excel


【解决方案1】:

经过多次与这个问题的斗争,我找到了以下解决方案:

  1. 在 64 位服务器和机器上,您需要首先卸载所有 32 位 Microsoft Office 应用程序和实例(Access 2007 安装、Office 10 32 位等)。否则,您将无法安装新的 64 位 Microsoft Access Database Engine 2010 Redistributable 组件。是的,这很令人头疼,但这是我发现为需要在 64 位机器上运行的 JET 引擎组件安装新替代品的唯一方法。
  2. 从 Microsoft 下载并安装新组件: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d&displaylang=en
    • 这将安装设置链接服务器、OPENROWSET excel 文件等所需的访问和其他引擎。
  3. 打开 SQL Server 并运行以下命令:

    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'Ad Hoc Distributed Queries', 1;
    GO
    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
    
    • 这会设置访问和运行与组件相关的查询所需的参数。地址'null
  4. 现在,如果您正在运行 OPENROWSET 调用,则需要放弃使用旧 JET 参数进行的调用并使用新调用,如下所示:

    (*Example, importing an EXCEL file directly into SQL):
    DONT DO THIS….
    SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;HDR=YES;Database=c:\PATH_TO_YOUR_EXCEL_FILE.xls','select * from [sheet1$]')
    
    USE THIS INSTEAD…
    SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=c:\PATH_TO_YOUR_EXCEL_FILE.xls','select * from [sheet1$]')
    
    *At this point resolved two SQL issues and ran perfectly
    
  5. 现在开始有趣的部分……..找到您的所有 Office 磁盘并将所需的 Office 和/或应用程序重新安装到计算机上。您可以通过进入磁盘并进入 64 位文件夹并运行它来安装 64 位版本的 Office 10,但请注意,在某些情况下,某些第三方应用程序尚未与该版本的 Office 交互。

【讨论】:

  • 对于它的价值,我能够在我的 64 位(Windows 8.1)机器上安装(并使用!)32 位版本的 Access 数据库引擎,并避免删除并重新安装舞蹈。我已经安装了 32 位版本的 Office 2013。
【解决方案2】:

试试这个

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                       'Excel 8.0;Database=C:\Export.xls;', 
                       'SELECT id_sale FROM [ExportSheet$]')
SELECT id_sale
FROM dbo.Sale

INSERT INTO OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\Export.xls;Extended Properties=EXCEL 8.0')...[ExportSheet$]
SELECT id_sale
FROM dbo.Sale

【讨论】:

  • 谢谢。告诉我为什么要 EXCEL 5.0 ?如果我想以 EXCEL 2010 格式保存,我需要怎么写?
  • 对不起。在您的情况下,必须 EXCEL=8.0。我更新答案。如果您想以 EXCEL 2010 格式保存,请使用扩展属性 = Excel 12.0 Xml Excel 97-2003 Workbook (.xls) "Excel 8.0" Excel 2007-2010 Workbook (.xlsx) "Excel 12.0 Xml" 的第一个查询
【解决方案3】:

我安装了 Office 32 位版本和 Sql server 2008 r2(64 位)。我尝试安装 64 位版本的 AccessDatabaseEngine 可再发行组件,但它不会让我这样做。然后我尝试安装 32 位版本,但随后 sql server 抱怨:

OLE DB provider 'Microsoft.ACE.OLEDB.12.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

然后我辞职到安装办公室 64 位。然后我注意到“Microsoft Sql server 2008 r2”启动菜单中的“导入和导出数据(32 位选项)”。所以我尝试了,它对我有用。

我一直在尝试通过右键单击“数据库->任务-导入数据..”来导入数据,这显然是打开了 64 位版本并让我很痛苦。

【讨论】:

    【解决方案4】:

    1- 如果您使用的是 32 位版本的 windows,请安装 AccessDatabaseEngine_x64.exe 或 AccessDatabaseEngine.exe(需要重新启动)。

    2- 如果您使用的是 SQL Management Studio,请以管理员身份运行 Management Studio。如果您不以管理员帐户运行它,则会出现此错误(无法为链接服务器“(null)”初始化 OLE DB 提供程序“MICROSOFT.ACE.OLEDB.12.0”的数据源对象。

    3- 运行此命令来配置您的数据库

    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE with override;
    GO
    
    EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
    RECONFIGURE with override;
    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
    

    4- 不要在 OPENROWSET 函数中使用“select * from sheet1$”。试试这个代码。

    select * from OPENROWSET('MICROSOFT.ACE.OLEDB.12.0', 'Excel 12.0;HDR=YES;DATABASE=D:\test.xlsx', sheet1$)
    

    如果您仍然有(32 位)错误,请尝试重新启动您的 SQL 服务并检查您的 C:\Windows\Temp 并查看您是否有权访问此目录。

    【讨论】:

      【解决方案5】:

      手动检查/设置下方的注册表项(具体路径取决于您的 SQL Server 版本):

      [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\Microsoft.ACE.OLEDB.12.0]
      "AllowInProcess"=dword:00000001
      "DynamicParameters"=dword:00000001
      

      同时使用 Jet 4.0 和 ACE.OLEDB.12 似乎有问题。

      【讨论】:

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