1

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

2 回答 2

1

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

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

于 2013-07-10T06:22:31.703 回答
0

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

于 2017-06-02T17:33:58.400 回答