Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机上注册

时间:2013-02-19 07:19:11

标签: asp.net

我正在尝试在我的应用程序中上传一些excel文件数据。从我的本地系统(Windows 7)我的代码工作正常。但在服务器(2003)中托管后,当我尝试上传文件(.xlsx)时,我收到错误 - System.InvalidOperationException:'Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机上注册。

我的代码:

         try
         {
             string connectionString = "";
             if (fuUpload.HasFile)
             {                  

                 string fileName = "_uploadTemp";
                 string fileExtension = Path.GetExtension(fuUpload.PostedFile.FileName);
                 string fileLocation = HttpContext.Current.Server.MapPath("~/FileUpload/" + fileName + fileExtension);
                 fuUpload.SaveAs(fileLocation);

                 lbl1.Text = "File Saved";

                 //Check whether file extension is xls or xslx

                 if (fileExtension == ".xls")
                 {
                     connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
                 }
                 else if (fileExtension == ".xlsx")
                 {
                     connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
                 }
                 lbCon.Text = connectionString;
                 //  Create OleDB Connection and OleDb Command

                 OleDbConnection con = new OleDbConnection(connectionString);
                 OleDbCommand cmd = new OleDbCommand();
                 cmd.CommandType = System.Data.CommandType.Text;
                 cmd.Connection = con;
                 OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
                 DataTable dtExcelRecords = new DataTable();


                 con.Open();

                 lbl2.Text = "Connection open";

                 //DataSet dtExcelSheetName=con.GetOleDbSchemaTable(OleDbDataAdapter.DefaultSourceTableName,null);
                 DataTable dtExcelSheetName = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                 string getExcelSheetName = dtExcelSheetName.Rows[0]["Table_Name"].ToString();
                 cmd.CommandText = "SELECT * FROM [" + getExcelSheetName + "]";
                 dAdapter.SelectCommand = cmd;
                 dAdapter.Fill(dtExcelRecords);
                 // dtExcelRecords = RemoveDuplicate(dtExcelRecords, "nOdc_Wwid");
                 con.Close();
                 lbl3.Text = "Connection Closed";
                 DataTable dttemp = new DataTable();
                 dttemp.Columns.Add("sOdc_People_Name", typeof(string));
                 dttemp.Columns.Add("vEmailId", typeof(string));
                 dttemp.Columns.Add("nOdc_Wwid", typeof(int));
                 dttemp.Columns.Add("Vpnaccess", typeof(string));//
                 dttemp.Columns.Add("Details", typeof(string));


                 for (int i = 0; i < dtExcelRecords.Rows.Count; i++)
                 {

                     dttemp.Rows.Add(dtExcelRecords.Rows[i][0].ToString(), dtExcelRecords.Rows[i][1].ToString(),
                     dtExcelRecords.Rows[i][2].ToString(), dtExcelRecords.Rows[i][3].ToString(), dtExcelRecords.Rows[i][4].ToString());
                 }

                 Session.Add("dtTemp", dttemp);//Created temp session to store the excel data

                 lbl4.Text = "Data added to temp table";


                 if (dttemp.Rows.Count <= 0)
                 {
                     gvMain.DataSource = mailutility.GetTempDataSetX("sOdc_People_Name", "vEmailId", "nOdc_Wwid", "Vpnaccess", "Details");
                     gvMain.DataBind();
                     gvMain.Rows[0].Visible = false;

                 }
                 else
                 {

                     gvMain.DataSource = dttemp;
                     gvMain.DataBind();
                     lnkConfirm.Visible = true;
                     lnkCancelC.Visible = true;
                     pnlLegend.Visible = true;
                     pnlLagendText.Visible = true;
                     mpX.Show();
                     lbl5.Text = "Grid binded";
                     foreach (GridViewRow gvr in gvMain.Rows)
                     {
                         CheckBox chkSelect = gvMain.Rows[gvr.RowIndex].Cells[0].FindControl("chkSelect") as CheckBox;
                         Label lblNameX = gvMain.Rows[gvr.RowIndex].Cells[1].FindControl("lblNameX") as Label;
                         Label lblEmailidX = gvMain.Rows[gvr.RowIndex].Cells[2].FindControl("lblEmailidX") as Label;
                         Label lblWwIdX = gvMain.Rows[gvr.RowIndex].Cells[3].FindControl("lblWwIdX") as Label;

                         if (lblNameX.Text != "" && IsValidEmail(lblEmailidX.Text) == true && ValidWWId(lblWwIdX.Text) == true)
                         {
                             chkSelect.Checked = true;
                         }
                         else
                         {
                             chkSelect.Checked = false;
                             chkSelect.Enabled = false;
                             gvr.BackColor = System.Drawing.Color.Yellow;
                         }
                         //Check for duplicate WWID
                         for (int i = 0; i < dttemp.Rows.Count; i++)
                         {
                             if (i != gvr.RowIndex)
                             {
                                 if (dttemp.Rows[i]["nOdc_Wwid"].ToString() == lblWwIdX.Text)
                                 {
                                     chkSelect.Checked = false;
                                     chkSelect.Enabled = false;
                                     gvr.BackColor = System.Drawing.Color.Yellow;
                                 }
                             }
                         }
                     }


                 }

             }
         }
         catch (Exception es)
         {
             lbException.Text = es.ToString();
         }

请有人帮助我。

Gulrej

2 个答案:

答案 0 :(得分:3)

1.尝试从此处下载:http://www.microsoft.com/en-us/download/confirmation.aspx?id=23734

2.转到Visual Studio,单击添加数据源,按照向导进行操作。

这是我之前遇到的问题,并遵循以下步骤:

http://social.msdn.microsoft.com/Forums/en-US/vstsdb/thread/1d5c04c7-157f-4955-a14b-41d912d50a64

如果目标计算机为x86 version,则需要安装32 bit;如果目标计算机为x64 version并且您的应用程序是64 bit,则需要安装{{1}}使用配置构建任何CPU。

答案 1 :(得分:0)

您需要检查的第一件事是您的应用程序的构建配置。

  • 如果在x86平台下构建项目,那么为了 解决你的问题你应该在你的安装上安装以下软件包 机器:

    1. 要使用'Microsoft.ACE.OLEDB.12.0'提供商,您必须这样做 安装Microsoft Access数据库引擎2010可再发行组件 首先,此安装位于: http://www.microsoft.com/download/en/details.aspx?id=13255

      安装完成后,尝试运行您的应用程序,如果这样 解决问题很好,如果没有,继续第2步。

    2. 下一步是一个无法解释的解决方法,适用于Office 2010年,即使它是Office 2007的数据连接组件。我不太确定为什么这样做有效,但确实如此,并且已经证明这几乎适用于所有情况。您需要安装2007 Office System驱动程序:数据连接组件,此安装位于: http://www.microsoft.com/download/en/confirmation.aspx?id=23734

      安装完成后,尝试运行您的应用程序,这应解决问题。

  • 如果您尝试运行在x64或AnyCPU下构建的应用程序 平台,我建议首先验证它是否按预期运行 在x86平台下。如果它不在那之下运行 x86平台,执行第一部分中的步骤并验证 它按预期运行。

    我确实读过MS Access驱动程序,包括OLEDB数据库 驱动程序仅在x86平台下工作,并且不兼容 x64或AnyCPU平台。但这似乎是不真实的。一世 验证我的应用程序在构建x86时运行,然后是我 使用被动标志安装Access数据库引擎。

    1. 首先在本地下载文件您可以下载安装 这里:http://www.microsoft.com/en-us/download/details.aspx?id=13255
    2. 使用带有'/ passive'标志的命令提示符进行安装。的在 命令提示符运行以下命令: 'AccessDatabaseEngine_x64.exe / passive'
    3. 在这两个步骤之后,我设法在建成之后运行我的应用程序 x64或AnyCPU构建配置。这似乎解决了我的问题。

注意:步骤的顺序似乎有所不同,因此请遵循相应的步骤。