簡體   English   中英

C#System.Data.OleDb.OleDbException錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM