C# SQLBulkCopy为所有列插入一个具有空值的新行

C# SQLBulkCopy为所有列插入一个具有空值的新行,c#,sqlbulkcopy,C#,Sqlbulkcopy,我有这段代码,它可以很好地将excel数据加载到SQL表中。唯一的问题是,它还为所有列插入一个具有空值的新行 using (OleDbConnection excel_con = new OleDbConnection(conString)) { excel_con.Open(); string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString()

我有这段代码,它可以很好地将excel数据加载到SQL表中。唯一的问题是,它还为所有列插入一个具有空值的新行

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中,但由代码创建。感谢您的帮助


您可以将查询更改为跳过excel中的空行:

"SELECT * FROM [" + Path.GetFileName(excelPath) + "] WHERE [Employee] IS NOT NULL"
这应该避免将空行添加到
数据表中。当然,您也可以稍后删除它们,但这样会降低效率。例如:

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

可以执行一些小操作来删除该行或添加该where条件。我正在为此寻找具体的解决办法。SQLBulkcopy I的任何属性可能丢失或有任何内容?@Sak您的行将存在于Excel和您填写的
数据表中。当您通过编辑然后删除某个值来“触摸”单元格时,通常会发生这种情况。这几乎肯定不是批量复制的问题——它会写下你给它的内容。@Sak:以上只是你自己查询的一个小修改。应该避免将空行添加到
DataTable
。当然,您也可以稍后删除它们,但这样会降低效率。例如:
dtExcelData=dtExcelData.AsEnumerable().Where(r=>!String.IsNullOrEmpty(r.Field(“Employee”)).CopyToDataTable()这似乎有点错误。源表的名称应为工作表名称(或命名范围)
“SELECT*FROM[”+sheet1+“]”
excel文件在所有文件中默认只有一个工作表“sheet1”。这对我来说很有效。