【.net】未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法

excel导入数据库 外部表不是预期的格式

string strConn1 = "Provider = Microsoft.ACE.OLEDB.4.0; " + "Data Source = " + fileName + "; " + “Extended Properties =“Excel 8.0;HDR=Yes””;

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法

string strConn1 = "Provider = Microsoft.ACE.OLEDB.12.0; " + "Data Source = " + fileName + "; " + “Extended Properties =“Excel 12.0;HDR=Yes””;

报错主要有以下几种原因:

1、没有安装数据访问组件,需要安装相应版本的数据访问组件(AccessDatabaseEngine);

2、没有安装相应版本的Office客户端,需要安装相应版本的Office客户端;

3、没有在IIS应用程序池配置默认属性,需要在相应的IIS应用程序池启用32位应用程序;

4、连接字符串的问题。采用Microsoft.Jet.OleDb.4.0,可以读取excel2007以前的版本,在客户机上不需要部署office,采用Microsoft.Ace.OleDb.12.0的时候,需要安装引擎。

5、顺便说一下,在使用“Microsoft.Jet.OLEDB.4.0”,也会报类似错误,原因有可能是,Microsoft.Jet.OLEDB.4.0在64位系统上不支持,需要修改架构,从x64改为x86,无论是WinForm还是ASP.NET;或者修改连接字符串为Microsoft.ACE.OLEDB.12.0并且安装AccessDatabaseEngine x64数据访问组件;

解决方案

1、安装数据访问组件:
  1)适用于office2007的
  Microsoft Access Database Engine 2007 Office system 驱动程序:数据连接组件
  https://www.microsoft.com/zh-cn/download/details.aspx?id=23734 (该链接已失效,直接用Microsoft Access Database Engine 2010 Redistributable就好了)
  2)适用于office2010的
  Microsoft Access Database Engine 2010 Redistributable
  https://www.microsoft.com/zh-CN/download/details.aspx?id=13255

此下载将安装一组组件,非 Microsoft Office 应用程序可以使用它们从 2007/2010 Office system 文件中读取数据,例如从 Microsoft Office Access 2007/2010(mdb 和 accdb)文件以及 Microsoft Office Excel 2007/2010(xls、xlsx 和 xlsb)文件中读取数据。这些组件还支持与 Microsoft Windows SharePoint Services 和文本文件建立连接。
  此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。
  2、在IIS应用程序池中,设置“”启用兼容32位应用程序”,此设置适用于web项目;

下载

前提是看服务器是x64的还是x86的,x64的服务器两个版本都能安装;
  如果下载安装的是x64的,那么你的桌面程序就要选择anycpu或x64发布,而web项目是不兼容的,不管你是如何发布的;

如果下载安装的是x86的,那么你的桌面程序就要选择x86发布,而web项目正常发布就好;
点击该连接下载:https://www.microsoft.com/zh-cn/download/details.aspx?id=13255下载

连接字符串

主要如下两种情况:

1)使用Office 2007 OLEDB驱动程序(ACE 12.0)连接到较旧的97-2003 Excel工作簿。
  
  Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myOldExcelFile.xls;
  Extended Properties=“Excel 8.0;HDR=YES”;
     “HDR =Yes;” 表示第一行包含列名,而不是数据。“HDR =No;” 表明相反;
    
  2)读取xlsx格式的excel
  
  Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;
  Extended Properties=“Excel 12.0 Xml;HDR=YES”;
    “HDR =Yes;” 表示第一行包含列名,而不是数据。“HDR =No;” 表明相反;

C#的winform窗体
写这个文章的出发点是 把excel表格数据导入 dataGridView 然后再导入到数据库里面!

//public void TransferData(string excelFile, string sheetName, string connectionString)
        //{
        //    DataSet ds = new DataSet();
        //    try
        //    {
        //        //获取全部数据     
        //        string strConn = "Provider = Microsoft.Jet.OLEDB.12.0;" + "Data Source=" + excelFile + ";" + "Extended Properties = Excel 12.0;";
        //        OleDbConnection conn = new OleDbConnection(strConn);
        //        conn.Open();
        //        string strExcel = "";
        //        OleDbDataAdapter myCommand = null;
        //        strExcel = string.Format("select * from [{0}$]", sheetName);
        //        myCommand = new OleDbDataAdapter(strExcel, strConn);
        //        myCommand.Fill(ds, sheetName);

        //        //如果目标表不存在则创建,excel文件的第一行为列标题,从第二行开始全部都是数据记录     
        //        string strSql = string.Format("if not exists(select * from sysobjects where name = '{0}') create table {0}(", sheetName);   //以sheetName为表名     

        //        foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
        //        {
        //            strSql += string.Format("[{0}] varchar(255),", c.ColumnName);
        //        }
        //        strSql = strSql.Trim(',') + ")";

        //        using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
        //        {
        //            sqlconn.Open();
        //            System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
        //            command.CommandText = strSql;
        //            command.ExecuteNonQuery();
        //            sqlconn.Close();
        //        }
        //        //用bcp导入数据        
        //        //excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的     
        //        using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
        //        {
        //            // bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
        //            bcp.BatchSize = 100;//每次传输的行数        
        //            bcp.NotifyAfter = 100;//进度提示的行数        
        //            bcp.DestinationTableName = sheetName;//目标表        
        //            bcp.WriteToServer(ds.Tables[0]);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        System.Windows.Forms.MessageBox.Show(ex.Message);
        //    }
        //}

        //private void button3_Click(object sender, EventArgs e)
        //{
        //    //测试,将excel中的student导入到sqlserver的db_test中,如果sql中的数据表不存在则创建        
        //    string connString = "server = (local); uid = sa; pwd = *****; database = ****";
        //    System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
        //    if (fd.ShowDialog() == DialogResult.OK)
        //    {

        //        string ll = System.IO.Path.GetFileNameWithoutExtension(fd.FileName);
        //        MessageBox.Show(ll);
        //        TransferData(ll, "sheel1", connString);

        //    }
        //}

你可能感兴趣的:(随笔)