C# SQLBulkCopy为所有列插入一个具有空值的新行
我有这段代码,它可以很好地将excel数据加载到SQL表中。唯一的问题是,它还为所有列插入一个具有空值的新行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()
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”。这对我来说很有效。