2017-09-30 12 views
1

Excelシートから特定の列をインポートし、SQL Serverテーブルの特定の列に挿入します。ExcelからSQL Serverの特定の列にインポート

以下のコードはデータをテーブルに挿入しません。グリッドビューのデータを正常に表示するがデータを挿入しないので、テーブル全体ではなく1つの列に挿入したいので、

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 
     } 
    } 

はまた、私はここからオープンとクローズの接続を削除します:

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

は、私は次のように(すでに「_Conn」変数でのSqlConnectionを持っていない限り)あなたがSqlConnectionオブジェクトを使用することをお勧め

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はちょうど1つの列を持っていません、私はあなたの変更を試みます –

関連する問題