【问题标题】:Import from Excel to specific columns in SQL Server从 Excel 导入到 SQL Server 中的特定列
【发布时间】:2017-09-30 10:32:47
【问题描述】:

我想从 Excel 工作表中导入特定列并插入到 SQL Server 表中的特定列中。

下面的代码没有向表中插入任何数据,我认为是因为主键是它在网格视图中成功显示数据但没有插入数据,所以我想插入一列而不是整个表:

protected void ImportButton_Click(object sender, EventArgs e)
{
    if (FileUpload1.HasFile)
    {
        string FileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
        string Extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
        string FolderPath = ConfigurationManager.AppSettings["FolderPath"];

        string FilePath = Server.MapPath(FolderPath + FileName);
        FileUpload1.SaveAs(FilePath);
        Import_To_Grid(FilePath);
    }
}

private void Import_To_Grid(string FilePath)
{
   string conStr = "";
   //switch (Extension)
   //{
   //    case ".xls": //Excel 97-03
   //        conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"]
   //                 .ConnectionString;
   //        break;
   //    case ".xlsx": //Excel 07
   //        conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"]
   //                  .ConnectionString;
   //        break;
   //}
   String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0\"", FilePath);

   conStr = String.Format(excelConnString, FilePath);

   OleDbConnection connExcel = new OleDbConnection(conStr);
   OleDbCommand cmdExcel = new OleDbCommand();
   OleDbDataAdapter oda = new OleDbDataAdapter();

   DataTable dt = new DataTable();
   cmdExcel.Connection = connExcel;

   //Get the name of First Sheet
   connExcel.Open();
   DataTable dtExcelSchema;
   dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
   string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
   connExcel.Close();

   //Read Data from First Sheet
   connExcel.Open();
   cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
   oda.SelectCommand = cmdExcel;
   oda.Fill(dt);

   using (OleDbDataReader dReader = cmdExcel.ExecuteReader())
   {
       using (SqlBulkCopy sqlBulk = new SqlBulkCopy(_Conn.ConnStr()))
       {
           //Set your Destination table name 
           sqlBulk.DestinationTableName = "[AIS].[Inventory].[Inventory_Movments_TBL]";
           sqlBulk.WriteToServer(dt);

           //Bind Data to GridView
           GridView1.Caption = Path.GetFileName(FilePath);
           GridView1.DataSource = dt;
           GridView1.DataBind();
       }
   }

   connExcel.Close();
}

【问题讨论】:

    标签: c# asp.net sql-server excel


    【解决方案1】:

    我建议你如下使用SqlConnection(除非你已经在'_Conn'变量中有一个SqlConnection):

        using (SqlConnection con = new SqlConnection(_Conn.ConnStr()))
        {
            using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
            {
                //Set the database table name
                sqlBulkCopy.DestinationTableName = "dbo.tblPersons";
    
                //Might be a good idea to map excel columns with that of the database table (optional)
                sqlBulk.ColumnMappings.Add("Id", "PersonId");
                sqlBulk.ColumnMappings.Add("Name", "Name");
                con.Open(); // these might be the issue since you need to open..
                sqlBulk.WriteToServer(dtExcelData);
                con.Close(); // ..and close the connection
            }
        }
    

    我还要从这里删除打开和关闭的连接:

    connExcel.Close();
    
    //Read Data from First Sheet
    connExcel.Open();
    cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
    oda.SelectCommand = cmdExcel;
    oda.Fill(dt);
    

    在填充后关闭 1 个连接(并删除底部的 'connExcel.Close();'):

    //Read Data from First Sheet
    cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
    oda.SelectCommand = cmdExcel;
    oda.Fill(dt);
    connExcel.Close();
    

    【讨论】:

    • 恕我直言,我的代码在另一个没有 PK 的表上运行良好,只有一列,我会尝试你的更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多