【问题标题】:SqlBulkCopy creating more rows than in DataTableSqlBulkCopy 创建的行数多于 DataTable
【发布时间】:2016-08-11 15:21:11
【问题描述】:

我正在使用 SqlBulkCopy 从 CSV 导入大约 66k 行。 CSV 被导入到 DataTable 中,然后传递到下面的方法中。

它似乎无限期地将相同的行复制到数据库中(或在到达末尾时重置)。调试运行了大约 30 分钟,并创建了近 35 万条记录,将 DataTable 中的每一行复制了大约 5 次。

我可以确认 DataTable 中的行数是正确的,所以我一定遗漏了什么,有什么想法吗?

注意:我添加了 s.BatchSize,希望它只会导入该数量,但事实并非如此。

  /*
     * StoreImportedData()
     * This method will store all of the imported data from the datatable to the SQL server database.
     * 
     *  
     */

    private Boolean StoreImportedData(DataTable csvFileData)
    {
        try
        {
            using (SqlConnection dbConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = "Staging";
                    // Amount of rows to issue in the batch: (currently value is around 60k)
                    s.BatchSize = csvFileData.Rows.Count;
                    s.ColumnMappings.Add("remark", "ReportDate");
                    s.ColumnMappings.Add("ipAddress", "IPAddress");
                    s.ColumnMappings.Add("hostName", "HostName");
                    s.ColumnMappings.Add("macAddress", "MacAddress");
                    s.ColumnMappings.Add("deviceName", "PrinterName");
                    s.ColumnMappings.Add("comment", "CenterCode");
                    s.ColumnMappings.Add("userName", "CustomerCode");
                    s.ColumnMappings.Add("userDisplayName", "CustomerName");
                    s.ColumnMappings.Add("printerBlackTotal", "TPrintBw");
                    s.ColumnMappings.Add("printerColorTotal", "TPrintCol");
                    s.ColumnMappings.Add("copyBlackTotal", "TCopyBw");
                    s.ColumnMappings.Add("copyColorTotal", "TCopyCol");
                    s.ColumnMappings.Add("scanTotal", "TScan");
                    s.ColumnMappings.Add("faxBlackTotal", "TFaxBw");
                    s.WriteToServer(csvFileData);
                }
            }
        }
        catch (Exception e)
        {
            throw new Exception("An error has occured with the import SQL operation: " + e.Message);
        }
        return true;
    }
}

【问题讨论】:

  • 暂存表上是否有唯一索引或主键?
  • 是的,有一个自动递增的主键 (Id)
  • 我的猜测是在表上添加一个唯一索引以防止多次插入,主键是自动增量将无济于事。
  • BatchSize 影响一次插入多少行,它不应该对您看到的重复有任何影响。

标签: c# .net csv datatable sqlbulkcopy


【解决方案1】:

试试这个:

s.WriteToServer(csvFileData.CreateDataReader());

【讨论】:

  • 出现异常:输入数组长于该表中的列数。
  • 这意味着你的列比上面提到的多。
  • 没错,我认为映射会忽略其余的行。我有没有办法将其设置为仅适用于映射中设置的行?
  • 您可以使用DataTable.Columns.Remove() 方法从数据表中删除不需要的列。例如; csvFileData.Columns.Remove("Col1");
猜你喜欢
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多