我正在尝试在我的应用程序中上传一些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
答案 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平台下构建项目,那么为了 解决你的问题你应该在你的安装上安装以下软件包 机器:
要使用'Microsoft.ACE.OLEDB.12.0'提供商,您必须这样做 安装Microsoft Access数据库引擎2010可再发行组件 首先,此安装位于: http://www.microsoft.com/download/en/details.aspx?id=13255。
安装完成后,尝试运行您的应用程序,如果这样 解决问题很好,如果没有,继续第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数据库引擎。
在这两个步骤之后,我设法在建成之后运行我的应用程序 x64或AnyCPU构建配置。这似乎解决了我的问题。
注意:步骤的顺序似乎有所不同,因此请遵循相应的步骤。