【问题标题】:SQLBulkCopy: Does Column Count make difference?SQLBulkCopy:列数有区别吗?
【发布时间】:2013-07-10 06:12:20
【问题描述】:

我尝试搜索但没有找到相对简单的事情的答案。我有一个 CSV,它没有我的数据库表中的所有列,并且它也错过了自动增量,CSV 中的主键。

我所做的只是将 CSV 读入 DataSet,然后运行传统的 SQLBulkCopy 代码将数据集的第一个表读取到数据库表。但它给了我以下错误:

The given ColumnMapping does not match up with any column in the source or destination.

我的批量复制代码是

using (SqlBulkCopy blkcopy = new SqlBulkCopy(DBUtility.ConnectionString))
{

    blkcopy.EnableStreaming = true;
    blkcopy.DestinationTableName = "Project_" + this.ProjectID.ToString() + "_Data";
    blkcopy.BatchSize = 100;
    foreach (DataColumn c in ds.Tables[0].Columns)
    {
        blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
    }

    blkcopy.WriteToServer(ds.Tables[0]);
    blkcopy.Close();
}

我添加了映射来测试,但删除映射部分并没有什么区别。如果我们删除它尝试按顺序匹配列的映射,并且由于列的计数不同,它们最终会导致不匹配的数据类型和较小的列值等。哦,是的,CSV 中的列名与表中的列名匹配,并且大小写相同。

编辑:我更改映射代码以比较来自实时数据库的列名。为此,我只需运行 SQL Select 查询以从数据库表中获取 1 条记录,然后执行以下操作

foreach (DataColumn c in ds.Tables[0].Columns)
{
    if (LiveDT.Columns.Contains(c.ColumnName))
    {
        blkcopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
    }
    else
    {
        log.WriteLine(c.ColumnName + " doesn't exists in final table");
    }
}

【问题讨论】:

  • 在只映射一个列后尝试中断 foreach,看看是否会遇到相同的错误。如果您不这样做,则其他列之一似乎没有正确映射。除非检查异常为您提供更多详细信息,否则您始终可以对哪一个进行二分搜索。

标签: sql-server sqlbulkcopy


【解决方案1】:

我会将 CSV 的结果转储到暂存 SQL 表中……然后从暂存表到生产表进行简单的插入。

也做一个简单的 CSV 导入 SQL 表,也许 CSV 文件中有一些空/无效的列。

【讨论】:

  • 我喜欢听从您的建议,但我们不太确定我们从 CSV 获得哪些列,它们可能会有所不同,并且当我阅读或发现 SQLBulkCopy 确实支持缺失列等,但事实并非如此我的情况。如果您有任何其他想法,请查看我的新编辑?如果没有,那么猜猜我必须遵循你的路径。
  • 另外,我必须读取多个 CSV,它们的大小都约为 1GB :),而且我们是并行进行的,据我了解,为每次读取创建新表并不好。跨度>
  • 我的建议是从简单的东西开始,所以你至少可以确定问题不在于 CSV 文件,也许你的 CSV 文件是 qoma(,) 分隔的,并且在文本中的某处你有 qoma 某处和它打破了格式,使用导入导出实用程序手动将文件转储到 SQL 会给你一些好主意。
  • 如果所有文件的格式都相同(列等),则只创建一个临时表....将数据插入其中....处理数据,然后立即截断表格。
  • 所有数据都是浮点值,一列是日期时间,所以数据中没有。并非所有 csv 都是相同的,有些缺少某些列,我们大约有 50 列,有些文件有 30 列,有些有 45 列或根据我们的源读取的可变列。
【解决方案2】:

我曾经遇到过这个问题,原因是列名的大小写不同。其中一列是 "Id",但在 DB 中是 "id"

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2010-09-13
    • 1970-01-01
    • 2022-02-04
    相关资源
    最近更新 更多