簡體   English   中英

C# SQL從excel批量插入到Excel和DataTable之間的SQL列映射

[英]C# SQL bulk insert from excel into SQL Column mapping between Excel and DataTable

我正在嘗試將記錄插入到 sql 中,但是當我嘗試在 Excel 和 SQl 表之間映射列時遇到了問題。 如果我取出映射,插入工作但數據最終出現在錯誤的字段中。 給出的錯誤是數據源不包含指定的列,即使它包含? 關於為什么無法識別 Excel 中的列標題的任何建議。 在此處輸入圖片說明

protected void LoadFile(object sender, EventArgs e)
    {
        {
            //Upload and save the file
            string path = Server.MapPath("~/Files/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
            FileUpload1.SaveAs(path);

            string conString = string.Empty;
            string extension = Path.GetExtension(FileUpload1.PostedFile.FileName);

            switch (extension)
            {
                case ".xls": //Excel 97-03
                    conString = ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + "; Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"");
                    break;
                case ".xlsx": //Excel 07 or higher
                    conString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= "+ path +";Extended Properties ='Excel 12.0 Xml;HDR=YES;IMEX=1';");
                    break;
                    //conString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + "; Extended Properties='Excel 12.0;HDR=YES;IMEX=1;';");
            }
            conString = string.Format(conString, path);
            using (OleDbConnection excel_con = new OleDbConnection(conString))
            {


                excel_con.Open();
               string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();

                OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
                DataSet ds = new DataSet();
                DataTable dtExcelData = new DataTable();

                OleDbConnection OleDbcon = new OleDbConnection(conString);

                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet1 + "]", OleDbcon);



                OleDbcon.Open();
                cmd.Connection = OleDbcon;
                objAdapter1 = new OleDbDataAdapter(cmd);
                objAdapter1.Fill(ds);
                dtExcelData = ds.Tables[0];
                excel_con.Close();


                using (SqlConnection con = new SqlConnection(ConString))
                {
                    using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
                    {
                        //Set the database table name
                        sqlBulkCopy.DestinationTableName = "dbo.mytable";

                        //[OPTIONAL]: Map the Excel columns with that of the database table
                        sqlBulkCopy.ColumnMappings.Add("Tag","Tag");
                        sqlBulkCopy.ColumnMappings.Add("ExitDate","ExitDate");
                        sqlBulkCopy.ColumnMappings.Add("Exit","Exit");
                        sqlBulkCopy.ColumnMappings.Add("Amount","Amount");
                        con.Open();
                        sqlBulkCopy.WriteToServer(dtExcelData);
                        con.Close();
                    }
                }
            }
        }`

任何幫助表示贊賞,謝謝!

從您的圖像看來,您在 excel 中的列標題沒有向左對齊(這可能表示空格)。 Exit an Amount 列看起來像是在它們的開頭有空格,這會破壞映射。 我已經試過你的代碼,它似乎有效。

對於 SQL 大容量復制映射,源列必須與 Excel 中的列名完全匹配,目標列必須與您要插入的 SQL 表中的列名完全匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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