zoukankan      html  css  js  c++  java
  • 64位的Sql Server使用OPENROWSET导入xlsx格式的excel数据的时候报错(转载)

    In the old times while all the CPUs were 32bit, we were happily using JET OLEDB Provider reaching Excel or MDB files for long time without any issues.

    After we started using x64 CPUs and x64 Windows machines, we noticed that JET OLEDB Provider is not working. The reason for this was x64 Windows operating systems were not containing x64 bit JET OLEDB Provider but they had 32bit JET OLEDB Provider. We needed to recompile our applications as 32bit by changing the "Target CPU" as x86 in our Visual Studio Projects (remember that default "Target CPU" fro a Visual Studio Project is "Any CPU"), or using a 32bit application pool for a web application just to be able host our app in a 32bit w3wp.exe.

    Now we have a new guy in the town. Let me introduce it : "Microsoft ACE OLEDB Provider". It's "ProgID" (in terms of COM/OLEDB) is "Microsoft.ACE.OLEDB.12". It does not come within the OS, you should install this manually by downloading it from here . The name of the download is "Microsoft Access Database Engine 2010 Redistributable" as this 64bit ACE OLEDB Provider is the result of our Office 2010. It has been around in the scene with Office 2007 but it was available as 32bit only.

    With the Office 2010, we have 64bit ACE OLEDB Provider which is good news 

    Here are some cases with the details how to use this new OLEDB Provider :

    CASE 1: Retrieving data from an Excel file in SQL Server

    Please follow the steps below :

    •1) Download our 64bit version (AccessDatabaseEngine_X64.exe) of our "Microsoft Access Database Engine 2010 Redistributable" from the URL below :

    http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en&WT.mc_id=soc-n-[TR]-loc-[Services]-[farukc]
    •2) Install AccessDatabaseEngine_X64.exe on your SQL Server machine


    •3) Open a new "Query Window" in SQL Server Management Studio (SSMS) after connecting to your SQL Server Engine and issue the T-SQL commands below :

    USE [master]
    
    GO
    
     
    
    sp_configure 'show advanced options', 1
    
    GO
    
    RECONFIGURE WITH OverRide
    
    GO
    
    sp_configure 'Ad Hoc Distributed Queries', 1
    
    GO
    
    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) Now try executing the query below :

    select * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:	emp	est.xlsx', [Sheet1$])

    Yuppe I got the data from XLSX

    CASE 2: Retrieving data from an Excel file in a .NET app
    •1) Download our 64bit version (AccessDatabaseEngine_X64.exe) of our "Microsoft Access Database Engine 2010 Redistributable" from the URL below :

    http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en
    •2) Install AccessDatabaseEngine_X64.exe on your x64 machine (Likely that it will be your web server which will be hosting your ASP.NET app in a 64bit app pool or the server that you will run your .NET Windows Service as 64bit etc.)


    •3) Use the System.Data.OleDBConnection with the connection string below :

    OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\temp\test.xls;Extended Properties="Excel 12.0;HDR=YES;"");

    P.S. 1 :  If you are going to deploy this app to a machine without ACE OLEDB Provider, don't forget that you should install "Microsoft Access Database Engine 2010 Redistributable" to the target machine.

    P.S. 2 : If you have Office 2010 32bit is installed on the machine you cannot install "Microsoft Access Database Engine 2010 Redistributable" 64bit .(意思就是一台机器上要么装32位的AccessDatabaseEngine驱动,要么装64位的AccessDatabaseEngine驱动,不能两个都装,如果要装64位的AccessDatabaseEngine驱动,先要在控制面板的程序中删除32位的Microsoft Access database engine 2010)

    P.S. 3 : 如果你安装了64位的AccessDatabaseEngine_X64.exe驱动后,有可能会导致SSMS的导入向导导入2007-2010的Excel失败,因为SSMS是一个32位的程序没法使用64位的AccessDatabaseEngine_X64.exe驱动,从操作系统控制面板的程序中卸载Microsoft Access database engine 2010后,安装32位的AccessDatabaseEngine.exe驱动即可,这样SSMS的导入向导就可以导入2007-2010的Excel文件了,但这又会导致前面介绍的OPENROWSET语句没法使用AccessDatabaseEngine驱动从而报错,所以鱼和熊掌不可兼得,请自行衡量

    P.S. 4 : AccessDatabaseEngine驱动是有语言之分的,本文前面提供的下载链接是英文版的AccessDatabaseEngine驱动,注意如果你的windows操作系统是中文的你需要安装中文的AccessDatabaseEngine驱动,如果你的windows操作系统是英文的,应该安装英文的AccessDatabaseEngine驱动,下载不一致语言的AccessDatabaseEngine驱动,可能会导致你安装失败,这一点请注意。下面的是中文版AccessDatabaseEngine驱动的下载链接:

    https://www.microsoft.com/zh-cn/download/details.aspx?id=13255

    原文链接

  • 相关阅读:
    mongodb 创建auto increment 自增函数
    QT通过IP地址定位地址(用get方法取数据)
    VC程序快速删除自己(可能做升级程序的时候有用)
    让程序出现在控制面板(写注册表)
    亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细) good
    Qt configure 参数不完全说明
    C语言和C++篇
    C#开源实现MJPEG流传输
    前端EASYUI的简化调用
    .NET Mvc Razor
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/8427325.html
Copyright © 2011-2022 走看看