2

我正在尝试在我的应用程序中上传一些 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();
         }

请有人帮助我。

古勒吉

4

2 回答 2

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 bitx64 version目标机器是否是64 bit并且您的应用程序是使用配置任何 CPU 构建的。

于 2013-02-19T07:23:33.297 回答
0

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

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

    1. 要使用“Microsoft.ACE.OLEDB.12.0”提供程序,您必须先 安装 Microsoft Access Database Engine 2010 Redistributable ,此安装可在以下网址获得: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 平台下运行,请执行第一部分中的步骤并验证它是否按预期运行。

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

    1. 首先在本地下载文件你可以在这里下载安装:http: //www.microsoft.com/en-us/download/details.aspx?id=13255
    2. 使用带有“/被动”标志的命令提示符进行安装。 在命令提示符下运行以下命令:'AccessDatabaseEngine_x64.exe /passive'

    在这两个步骤之后,我设法在 x64 或 AnyCPU 构建配置中运行我的应用程序。这似乎解决了我的问题。

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

于 2015-09-24T08:49:27.757 回答