2016-06-17 7 views
0

このコードはうまく動作し、ExcelテーブルにSQLデータを読み込みます。唯一の問題は、すべての列に対してNULL値を持つ新しい行を挿入することです。SQLBulkCopyは、すべての列にNULL値を持つ新しい行を挿入します。

using (OleDbConnection excel_con = new OleDbConnection(conString)) 
{ 
excel_con.Open(); 
string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString(); 
DataTable dtExcelData = new DataTable(); 
using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + Path.GetFileName(excelPath) + "]", excel_con)) 
      { 
       oda.Fill(dtExcelData); 
      } 
      excel_con.Close(); 

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


        sqlBulkCopy.BulkCopyTimeout = 200; 

        sqlBulkCopy.ColumnMappings.Add("Employee", "Employee_Name"); 
        sqlBulkCopy.ColumnMappings.Add("Sal/Hourly", "Sal/Hourly"); 

        sqlBulkCopy.ColumnMappings.Add("Total", "Total"); 

        con.Open(); 
        sqlBulkCopy.WriteToServer(dtExcelData); 
        con.Close(); 
       } 
      } 
} 

この2988行はExcelには存在しませんが、コードによって作成されます。どんな助けもありがとうございます。

enter image description here

+0

これは少し間違っているようです。 SELECT * FROM ["+ sheet1 +"] "' – Slai

+0

excelファイルには、デフォルトで "sheet1"というシートが1つしかありません。すべてのファイルがデフォルトでfotされます。それは私のために働く。 – Sak

答えて

0

Excelで、空行をスキップするために、あなたのクエリを変更することができます:

"SELECT * FROM [" + Path.GetFileName(excelPath) + "] WHERE [Employee] IS NOT NULL" 

この空の行がDataTableに追加されていることを避ける必要があります。もちろん後で削除することもできますが、効率が悪くなります。例:

dtExcelData = dtExcelData.AsEnumerable() 
    .Where(r => !String.IsNullOrEmpty(r.Field<string>("Employee"))) 
    .CopyToDataTable(); 
+0

行を削除するか、条件を追加するために小さな操作を行うことができます。私はこれのための具体的な解決策を探しています。 SQLBulkcopyのプロパティが不足しているか何かがありますか? – Sak

+1

@Sakあなたの行*はExcelとあなたが入力した 'DataTable'に存在します。値を編​​集して削除してセルに触れると、しばしば起こります。これは大部分のコピーではほとんど問題ではありません。あなたが与えるものを書きます。 –

+1

@Sak:上記はあなた自身のクエリのわずかな変更です。空の行が 'DataTable'に追加されるのを避けるべきです。もちろん後で削除することもできますが、効率が悪くなります。例: 'dtExcelData = dtExcelData.AsEnumerable()。ここで(r =>!String.IsNullOrEmpty(r.Field (" Employee "))))。CopyToDataTable();' –

関連する問題