【问题标题】:SQLBulkCopy inserts a new row with NULL values for all columnsSQLBulkCopy 为所有列插入一个具有 NULL 值的新行
【发布时间】:2016-06-17 11:06:23
【问题描述】:

我有这段代码可以正常工作,并将 Excel 数据加载到 SQL 表中。唯一的问题是它还会插入一个新行,所有列的值为 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 中不存在,但代码会创建它。任何帮助表示赞赏。

【问题讨论】:

  • 这似乎有点不对劲。源表的名称应该是工作表名称(或命名范围)"SELECT * FROM [" + sheet1 + "]"
  • excel文件默认只有一张“sheet1”所有文件。所以它对我有用。

标签: c# sqlbulkcopy


【解决方案1】:

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

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

这应该避免将空行添加到DataTable。当然,您也可以稍后删除它们,但效率会降低。例如:

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

【讨论】:

  • 可以进行一些小操作来删除该行或添加此 where 条件。我正在为此寻找具体的解决方案。我可能会丢失 SQLBulkcopy 的任何属性或任何东西?
  • @Sak 您的行存在于 Excel 和您已填写的 DataTable 中。当您通过编辑然后删除一个值来“触摸”一个单元格时,通常会发生这种情况。这几乎肯定不是批量复制的问题 - 它会写出你给它的东西。
  • @Sak:上面只是对您自己的查询的一个小修改。应该避免将空行添加到DataTable。当然,您也可以稍后删除它们,但效率会降低。例如:dtExcelData=dtExcelData.AsEnumerable().Where(r=&gt;!String.IsNullOrEmpty(r.Field&lt;string&gt;("Employee"))).CopyToDataTable();
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2020-06-02
相关资源
最近更新 更多