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