[英]C# System.Data.OleDb.OleDbException Error
我在C#中的代碼有問題。 對不起,我是新手。 我想將數據導入和導出到數據庫。 當我導入* .xlsx時,我會說通俗的:
異常類型“ System.Data.OleDb.OleDbException” ASP Export Import.dll,但未在用戶代碼中處理附加信息:字符串“ EmployeeData $”不是有效名稱
Deafult.aspx.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ASPExportImport
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PopulateData();
lblMessage.Text = "Current Database Data!";
}
}
private void PopulateData()
{
using (MuDatabaseEntities dc = new MuDatabaseEntities())
{
gvData.DataSource = dc.EmployeeMaster.ToList();
gvData.DataBind();
}
}
protected void btnImport_Click(object sender, EventArgs e)
{
if (FileUpload1.PostedFile.ContentType == "application/vnd.ms-excel" ||
FileUpload1.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
try
{
string fileName = Path.Combine(Server.MapPath("~/ImportDocument"), Guid.NewGuid().ToString() + Path.GetExtension(FileUpload1.PostedFile.FileName));
FileUpload1.PostedFile.SaveAs(fileName);
string conString = "";
string ext = Path.GetExtension(FileUpload1.PostedFile.FileName);
if (ext.ToLower() == ".xls")
{
conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\""; ;
}
else if (ext.ToLower() == ".xlsx")
{
conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}
string query = "Select [EmployeeID],[CompanyName], [ContactName],[ContactTitle],[EmployeeAdress],[PostalCode] from [EmployeeData$]";
OleDbConnection con = new OleDbConnection(conString);
if (con.State == ConnectionState.Closed)
{
con.Open();
}
OleDbCommand cmd = new OleDbCommand(query, con);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
da.Dispose();
con.Close();
con.Dispose();
// Import to Database
using (MuDatabaseEntities dc = new MuDatabaseEntities())
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
string empID = dr["EmployeeID"].ToString();
var v = dc.EmployeeMaster.Where(a => a.EmployeeID.Equals(empID)).FirstOrDefault();
if (v != null)
{
// Update here
v.CompanyName = dr["CompanyName"].ToString();
v.ContactName = dr["ContactName"].ToString();
v.ContactTitle = dr["ContactTitle"].ToString();
v.EmployeeAdress = dr["EmployeeAdress"].ToString();
v.PostalCode = dr["PostalCode"].ToString();
}
else
{
// Insert
dc.EmployeeMaster.Add(new EmployeeMaster
{
EmployeeID = dr["EmployeeID"].ToString(),
CompanyName = dr["CompanyName"].ToString(),
ContactName = dr["ContactName"].ToString(),
ContactTitle = dr["ContactTitle"].ToString(),
EmployeeAdress = dr["EmployeeAdress"].ToString(),
PostalCode = dr["PostalCode"].ToString()
});
}
}
dc.SaveChanges();
}
PopulateData();
lblMessage.Text = "Successfully data import done!";
}
catch (Exception)
{
throw;
}
}
}
protected void btnExport_Click(object sender, EventArgs e)
{
using (MuDatabaseEntities dc = new MuDatabaseEntities())
{
List<EmployeeMaster> emList = dc.EmployeeMaster.ToList();
StringBuilder sb = new StringBuilder();
if (emList.Count > 0)
{
string fileName = Path.Combine(Server.MapPath("~/ImportDocument"), DateTime.Now.ToString("ddMMyyyyhhmmss") + ".xlsx");
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0 Xml;HDR=Yes'";
using (OleDbConnection con = new OleDbConnection(conString))
{
string strCreateTab = "Create table EmployeeData (" +
" [Employee ID] varchar(50), " +
" [Company Name] varchar(200), " +
" [Contact Name] varchar(200), " +
" [Contact Title] varchar(200), " +
" [Employee Address] varchar(200), " +
" [Postal Code] varchar(50))";
if (con.State == ConnectionState.Closed)
{
con.Open();
}
OleDbCommand cmd = new OleDbCommand(strCreateTab, con);
cmd.ExecuteNonQuery();
string strInsert = "Insert into EmployeeData([Employee ID],[Company Name]," +
" [Contact Name], [Contact Title], [Employee Address], [Postal Code]" +
") values(?,?,?,?,?,?)";
OleDbCommand cmdIns = new OleDbCommand(strInsert, con);
cmdIns.Parameters.Add("?", OleDbType.VarChar, 50);
cmdIns.Parameters.Add("?", OleDbType.VarChar, 200);
cmdIns.Parameters.Add("?", OleDbType.VarChar, 200);
cmdIns.Parameters.Add("?", OleDbType.VarChar, 200);
cmdIns.Parameters.Add("?", OleDbType.VarChar, 200);
cmdIns.Parameters.Add("?", OleDbType.VarChar, 50);
foreach (var i in emList)
{
cmdIns.Parameters[0].Value = i.EmployeeID;
cmdIns.Parameters[1].Value = i.CompanyName;
cmdIns.Parameters[2].Value = i.ContactName;
cmdIns.Parameters[3].Value = i.ContactTitle;
cmdIns.Parameters[4].Value = i.EmployeeAdress;
cmdIns.Parameters[5].Value = i.PostalCode;
cmdIns.ExecuteNonQuery();
}
}
// Create Downloadable file
byte[] content = File.ReadAllBytes(fileName);
HttpContext context = HttpContext.Current;
context.Response.BinaryWrite(content);
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
context.Response.AppendHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx");
Context.Response.End();
}
}
}
}
}
Deafult.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ASPExportImport._Default" %> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> <h3>Import / Export database data from/to Excel.</h3> <div> <table> <tr> <td>Select File : </td> <td> <asp:FileUpload ID="FileUpload1" runat="server" /> </td> <td> <asp:Button ID="btnImport" runat="server" Text="Import Data" OnClick="btnImport_Click" /> </td> </tr> </table> <div> <br /> <asp:Label ID="lblMessage" runat="server" Font-Bold="true" /> <br /> <asp:GridView ID="gvData" runat="server" AutoGenerateColumns="false"> <EmptyDataTemplate> <div style="padding:10px"> Data not found! </div> </EmptyDataTemplate> <Columns> <asp:BoundField HeaderText="EmployeeID" DataField="EmployeeID" /> <asp:BoundField HeaderText="CompanyName" DataField="CompanyName" /> <asp:BoundField HeaderText="ContactName" DataField="ContactName" /> <asp:BoundField HeaderText="ContactTitle" DataField="ContactTitle" /> <asp:BoundField HeaderText="Address" DataField="EmployeeAddress" /> <asp:BoundField HeaderText="PostalCode" DataField="PostalCode" /> </Columns> </asp:GridView> <br /> <asp:Button ID="btnExport" runat="server" Text="Export Data" OnClick="btnExport_Click" /> </div> </div> </asp:Content>
要導入的示例文件: http : //185.5.99.98/EmployeeData.xlsx
完整專案: http ://185.5.99.98/ASPExportImport.zip
謝謝所有答案...。
string query = "Select [EmployeeID],[CompanyName], [ContactName],[ContactTitle],[EmployeeAdress],[PostalCode] from [EmployeeData$]";
看來您正在嘗試從無效的表名中提取數據。 上面列出的代碼片段中是否故意使用$符號?
假設您嘗試從表名EmployeeData而不是EmployeeData $中提取數據,請更改SQL查詢以使用:
...FROM [EmployeeData]
編輯我下載了示例文件,並手動將它們剪切到一個新項目中以測試您的例程。 看起來代碼本身可以正常工作。 我可以毫無問題地訪問excel電子表格。 請檢查您的Excel電子表格是否有錯字。 我注意到您的示例電子表格中存在很多錯誤,這些錯誤會導致查詢崩潰。 具體來說,請確認電子表格中的標簽頁名為EmployeeData。 此外,驗證所有列標題的拼寫。
下面的代碼段沒有任何問題,並且應該包含讀取excel電子表格的核心功能。
using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
string fileName = @"Fully Justified path\testbook.xlsx";
string ext = ".xlsx";
string conString = "";
if (ext.ToLower() == ".xls")
{
conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\""; ;
}
else if (ext.ToLower() == ".xlsx")
{
conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}
string query = "Select [EmployeeID],[CompanyName], [ContactName],[ContactTitle],[EmployeeAdress],[PostalCode] from [EmployeeData$]";
OleDbConnection con = new OleDbConnection(conString);
if (con.State == ConnectionState.Closed)
{
con.Open();
}
OleDbCommand cmd = new OleDbCommand(query, con);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
da.Dispose();
con.Close();
con.Dispose();
foreach (DataRow dr in ds.Tables[0].Rows)
{
string empID = dr["EmployeeID"].ToString();
// Update here
string empID1 = dr["CompanyName"].ToString();
string empID2 = dr["ContactName"].ToString();
string empID3 = dr["ContactTitle"].ToString();
string empID4 = dr["EmployeeAdress"].ToString();
string empID5 = dr["PostalCode"].ToString();
}
}
catch (Exception)
{
throw;
}
}
}
}
嗨,朋友thx尋求答案...我在html中搜索:
<asp:BoundField HeaderText="Address" DataField="EmployeeAddress" />
一定是
<asp:BoundField HeaderText="Address" DataField="EmployeeAdress" />
我知道地址是錯誤的單詞;)對不起我的英語;)
在工作表中是
員工編號
一定是
員工編號
並且效果很好;)謝謝大家。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.