2016-06-17 85 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」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:above僅僅是你自己查詢的一個小修改。它應該避免將空行添加到'DataTable'中。當然,你也可以稍後刪除它們,但效率不高。例如:'dtExcelData = dtExcelData.AsEnumerable()。其中​​(r =>!String.IsNullOrEmpty(r.Field (「Employee」)))。CopyToDataTable();' –

相關問題