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();
         }

誰か助けてください。

Gulrej

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 bitある場合、またはx64 versionターゲット マシンが64 bitあり、アプリケーションが任意の CPU の構成でビルドされている場合は、をインストールする必要があります。

于 2013-02-19T07:23:33.297 に答える
0

最初に確認する必要があるのは、アプリケーションのビルド構成です。

  • プロジェクトを x86 プラットフォームでビルドした場合、問題を解決するには、マシンに次のパッケージをインストールする必要があります。

    1. 「Microsoft.ACE.OLEDB.12.0」プロバイダーを使用するには、 最初にMicrosoft Access データベース エンジン 2010 再頒布可能パッケージをインストールする必要 があります。このインストールは、http: //www.microsoft.com/download/en/details.aspxで入手できます。 ?id=13255 .

      インストールが完了したら、アプリケーションを実行してみます。これで問題が解決した場合は、ステップ 2 に進みます。

    2. この次のステップは、Office 2007 のデータ接続コンポーネントですが、Office 2010 で機能する説明のつかない回避策です。これが機能する理由はよくわかりませんが、機能し、ほとんどすべてのケースで機能することが証明されています。2007 Office System Driver: Data Connectivity Componentsをインストールする必要があります。このインストールは 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. 「/passive」フラグを指定してコマンド プロンプトを使用してインストールします。 コマンド プロンプトで次のコマンドを実行します。「AccessDatabaseEngine_x64.exe /passive」

    これらの 2 つの手順の後、x64 または AnyCPU ビルド構成でビルドした後、アプリケーションを実行することができました。これは私の問題を解決するように見えました。

注: 手順の順序が異なるようですので、それに応じてください。

于 2015-09-24T08:49:27.757 に答える