2017-02-22 3 views
0

SQLにレコードを挿入しようとしていますが、ExcelとSQlテーブルの間でカラムをマップしようとすると問題が発生します。マッピングを外した場合、挿入は機能しますが、データは間違ったフィールドに入ります。与えられたエラーは、データソースには指定された列が含まれていなくても含まれているということですか?なぜそれがExcelの列見出しを認識していないのかについての示唆。 enter image description hereC#SQLからExcelへのSQLの一括挿入ExcelとDataTableの間のカラムマッピング

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(); 
        } 
       } 
      } 
     }` 

すべてのヘルプは高く評価され、ありがとうございました!

+0

デバッグ作業にどれだけの時間を費やしましたか?データを含むスプレッドシートを作成してこのコードを使用し、dtExcelDataをレビューするためにブレークポイントを設定すると、ColumnNamesをドリルダウンして、それぞれのように表示できます。このコードの内部でこれを行うことができることを確認できますか? – tjcertified

+0

挿入しているテーブルのスキーマを指定できますか? – Ehz

答えて

0

画像からは、Excelの列見出しが左にずれることはないようです(スペースを示す可能性があります)。 [Exit an Amount]列は、開始時にスペースがあるように見えます。これは、マッピングを壊すことになります。私はあなたのコードを試して、それは働いているようだ。

SQLバルク・コピー・マッピングの場合、ソース列はExcelの列名と正確に一致していなければなりません。また、宛先列は、挿入するSQL表の列名と正確に一致する必要があります。

+0

ありがとうございます。あなたが正しいです。私は完全にそれを見て、私のExcelシートの各列の見出しの先頭に二重のスペースがありました。再度、感謝します – MOEma

関連する問題