2016-06-17 4 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» по умолчанию для всех файлов. поэтому он работает для меня. – 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 (« Сотрудник »))). CopyToDataTable();' –

Смежные вопросы