SQLBulkCopy:列数是否有所不同?

时间:2013-07-10 06:12:21

标签: sql-server sqlbulkcopy

我尝试搜索,但没有找到相对简单的事情的答案。我有一个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();
}

我添加了Mapping来测试,但删除映射部分没有区别。如果我们删除它尝试按顺序匹配列的映射,并且因为列的计数不同,它们会导致不匹配的数据类型和较小的列值等等。哦,是的,CSV中的列名称与Table中的列名称匹配,并且是相同的情况。 / p>

编辑:我更改映射代码以比较实时数据库中的列名。为此,我只需运行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");
    }
}

2 个答案:

答案 0 :(得分:1)

我会将CSV的结果转储到临时SQL表中......然后从登台表到生产表执行简单的插入。

也可以简单地将CSV导入到SQL表中,也许CSV文件中有一些空/无效列。

答案 1 :(得分:0)

我曾经遇到过这个问题,原因是列名称的情况有所不同。其中一列是“Id”,但在数据库中它是“id”