2017-09-30 22 views
1

我想要从Excel工作表导入特定列并将其插入到SQL Server表中的特定列中。从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(); 
} 

回答

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(); 
+0

我都尊重我的代码上的另一台正常工作,其没有PK只有一列,我会尝试你的改变 –