我尝试搜索,但没有找到相对简单的事情的答案。我有一个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");
}
}
答案 0 :(得分:1)
我会将CSV的结果转储到临时SQL表中......然后从登台表到生产表执行简单的插入。
也可以简单地将CSV导入到SQL表中,也许CSV文件中有一些空/无效列。
答案 1 :(得分:0)
我曾经遇到过这个问题,原因是列名称的情况有所不同。其中一列是“Id”,但在数据库中它是“id”。