C# 将数据从Excel插入数据库

C# 将数据从Excel插入数据库,c#,asp.net,excel,C#,Asp.net,Excel,我有一个excel工作表,我想要的是我想上传到数据库表的excel工作表记录。但在这方面 Emp\u代码是标识 Qns是身份 我试着像下面一样 protected void btnUpload_Click(object sender, EventArgs e) { DataTable dtExcel = new DataTable(); dtExcel.Clear(); string StrCount = String.Empty; string connStri

我有一个excel工作表,我想要的是我想上传到数据库表的excel工作表记录。但在这方面

  • Emp\u代码
    是标识

  • Qns
    是身份

  • 我试着像下面一样

    protected void btnUpload_Click(object sender, EventArgs e)
    {
        DataTable dtExcel = new DataTable();
        dtExcel.Clear();
        string StrCount = String.Empty;
        string connString = "";
        HttpPostedFile File = FileUpload1.PostedFile;
        string strFileType = Path.GetExtension(FileUpload1.FileName).ToLower();
        string path = FileUpload1.PostedFile.FileName;
        string Filename = path.Substring(path.LastIndexOf("\\") + 1, path.Length - path.LastIndexOf("\\") - 1);
        path = Server.MapPath(@"~/Excels/" + "/" + Filename.ToString());
    
        File.SaveAs(path);
        if (strFileType.Trim() == ".xls")
        {
            connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
            // connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
        }
        else if (strFileType.Trim() == ".xlsx")
        {
            connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
        }
        string query = "SELECT * FROM [Sheet 1$]";
        OleDbConnection conn = new OleDbConnection(connString);
        conn.Close();
        if (conn.State == System.Data.ConnectionState.Closed)
            conn.Open();
        OleDbCommand cmd = new OleDbCommand(query, conn);
        OleDbDataAdapter daExcel = new OleDbDataAdapter(cmd);
        StringBuilder StrPubBldg = new System.Text.StringBuilder();
        XmlWriter xw = XmlWriter.Create(StrPubBldg);
        string ExcelfileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
        xw.WriteStartElement("DocumentElement");
        {
            xw.WriteStartElement("Emp_Eval_Proc_hdr");
            xw.WriteElementString("mkey", (0 + 1).ToString());
            xw.WriteElementString("Emp_Code", dtExcel.Rows[1][("Emp Code")].ToString());  //  Identity
            xw.WriteElementString("Emp_Name", dtExcel.Rows[2][("Emp Name")].ToString());
            xw.WriteElementString("Qns_No", dtExcel.Rows[3][("Qns No")].ToString()); //  Identity
            xw.WriteElementString("Self", dtExcel.Rows[0][("Self")].ToString());
            xw.WriteElementString("AS1", dtExcel.Rows[0][("AS1")].ToString());
      }
    
    但得到的错误是

    位置1处没有行


    如何做???

    dtExcel,您创建了一个新的数据表,然后立即清除它,然后尝试访问数据。你应该遵循这个概念模型。它不必精确,原则是将数据加载到最小的容器中,对于这个容器,它是一个DataTable,检查是否有行,然后根据需要进行迭代

    根据海报要求,移除第一个代码样本,替换为新样本

    using System.Data;
    using System.Data.OleDb;
    using System.Text;
    using System.Xml;
    
    namespace Example
    {
        /// <summary>
        /// Create instance of this class,
        /// pass in file name and if excel sheet has headers e.g. YES or NO
        /// execute Work method, is currently incomplete
        /// </summary>
        public class StackOverFlowDemo
        {
            private string CreateConnectionString(string FileName, string Header)
            {
                OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
                if (System.IO.Path.GetExtension(FileName).ToUpper() == ".XLS")
                {
                    Builder.Provider = "Microsoft.Jet.OLEDB.4.0";
                    Builder.Add("Extended Properties", string.Format("Excel 8.0;IMEX=2;HDR={0};", Header));
                }
                else
                {
                    Builder.Provider = "Microsoft.ACE.OLEDB.12.0";
                    Builder.Add("Extended Properties", string.Format("Excel 12.0;IMEX=2;HDR={0};", Header));
                }
    
                Builder.DataSource = FileName;
    
                return Builder.ConnectionString;
            }
            public string ConnectionString { get; set; }
            public StackOverFlowDemo(string FileName, string Header)
            {
                ExcelTable = new DataTable();
                CreateConnectionString(FileName, Header);
                LoadData();
            }
            public DataTable ExcelTable { get; set; }
            public void LoadData()
            {
                using (OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString })
                {
                    cn.Open();
    
                    using (OleDbCommand cmd = new OleDbCommand { CommandText = "SELECT * FROM [Sheet 1$]", Connection = cn })
                    {
                        OleDbDataReader dr = cmd.ExecuteReader();
                        ExcelTable.Load(dr);
                    }
                }
            }
            public void Work()
            {
                StringBuilder StrPubBldg = new System.Text.StringBuilder();
                XmlWriter xw = XmlWriter.Create(StrPubBldg);
                // continue logic
            }
        }
    }
    
    使用系统数据;
    使用System.Data.OleDb;
    使用系统文本;
    使用System.Xml;
    名称空间示例
    {
    /// 
    ///创建该类的实例,
    ///输入文件名以及excel工作表是否有标题,例如是或否
    ///执行工作方法,当前不完整
    /// 
    公共类StackOverFlowDemo
    {
    私有字符串CreateConnectionString(字符串文件名、字符串头)
    {
    OleDbConnectionStringBuilder=新的OleDbConnectionStringBuilder();
    if(System.IO.Path.GetExtension(FileName.ToUpper()=“.XLS”)
    {
    Builder.Provider=“Microsoft.Jet.OLEDB.4.0”;
    Add(“扩展属性”,string.Format(“Excel8.0;IMEX=2;HDR={0};”,标头));
    }
    其他的
    {
    Builder.Provider=“Microsoft.ACE.OLEDB.12.0”;
    Add(“扩展属性”,string.Format(“Excel12.0;IMEX=2;HDR={0};”,标头));
    }
    Builder.DataSource=文件名;
    返回Builder.ConnectionString;
    }
    公共字符串连接字符串{get;set;}
    公共StackOverFlowDemo(字符串文件名、字符串头)
    {
    ExcelTable=新数据表();
    CreateConnectionString(文件名、标题);
    LoadData();
    }
    公共数据表ExcelTable{get;set;}
    公共void LoadData()
    {
    使用(OleDbConnection cn=new-OleDbConnection{ConnectionString=ConnectionString})
    {
    cn.Open();
    使用(OleDbCommand cmd=new-OleDbCommand{CommandText=“SELECT*FROM[Sheet 1$]”,Connection=cn})
    {
    OleDbDataReader dr=cmd.ExecuteReader();
    卓越负荷(dr);
    }
    }
    }
    公共工程()
    {
    StringBuilder StrPubBldg=new System.Text.StringBuilder();
    XmlWriter xw=XmlWriter.Create(strpubldg);
    //继续逻辑
    }
    }
    }
    
    这是一项重复性任务还是仅仅一次?这将是一项重复性任务。。!!如果某些数据存在的记录可能为,则该记录将被更新。如果excel工作表只有一行,则您将获得该记录error@RachitPatel:我有很多行,但目前数据是3列的数据。我只是想测试数据是否被插入。你能根据我的代码修改一下吗?对不起