SQL 具有不同列名的批量复制映射?
SQL Bulk Copy mapping with different column names?
我们的 table 中有几列不是用户友好的名称,因此我们在实际的 GUI 中更改它们。
例如,数据库中的一列被标记为"IntAmt",但用户没有任何线索,所以在程序中我们称这一列为"Interest Amount"。
问题是如果我使用如下所示的直接列映射,那么它将出错,因为这些列不匹配。数据库中没有名为 "InterestAmount"
的列
那么有没有一种方法可以在使用注释或其他东西进行映射时引用正确的列名?我们也在使用 Entity Framework。
var connection = DbContext.Database.Connection.ConnectionString;
using (SqlConnection sqc = new SqlConnection(connection))
{
sqc.Open();
using (SqlBulkCopy bcp = new SqlBulkCopy(sqc))
{
bcp.DestinationTableName = strTargetTable;
sourceData.Columns.Cast<DataColumn>().ToList().ForEach(x =>
bcp.ColumnMappings
.Add(new SqlBulkCopyColumnMapping(x.ColumnName, x.ColumnName)));
bcp.BatchSize = 50000;
bcp.BulkCopyTimeout = 12000;
bcp.WriteToServer(sourceData);
}
sqc.Close();
}
经过进一步调查,我们将列映射存储在 table 中,因此 table 看起来像这样
TableName: ColumnMappingTable
[ColumnName] [GuiColumnName]
IntAmt InterestAmount
PrinAmt PrincipalAmount
也就是说,有没有一种方法可以动态映射这种方式?
我们有很多 table 并且在代码中单独硬编码映射每个名称会花费很多时间
尝试使用 TableMappings.Add()
Article供参考:
在定义db对象的class中添加SqlBulkCopyColumnMapping类型的IEnumerable
public static IEnumerable<SqlBulkCopyColumnMapping> GetObjectNameColumnMappings()
{
return new[]
{
new SqlBulkCopyColumnMapping(nameof(propertyName), "dbColumnName"),
new SqlBulkCopyColumnMapping(nameof(propertyName2), "dbColumnName2")
};
}
然后调用此方法并将其设置为等于您的列映射
using (SqlBulkCopy bcp = new SqlBulkCopy(sqc))
{
bcp.DestinationTableName = strTargetTable;
bcp.ColumnMappings = classInstance.GetObjectNameColumnMappings();
bcp.BatchSize = 50000;
bcp.BulkCopyTimeout = 12000;
bcp.WriteToServer(sourceData);
}
我们的 table 中有几列不是用户友好的名称,因此我们在实际的 GUI 中更改它们。
例如,数据库中的一列被标记为"IntAmt",但用户没有任何线索,所以在程序中我们称这一列为"Interest Amount"。
问题是如果我使用如下所示的直接列映射,那么它将出错,因为这些列不匹配。数据库中没有名为 "InterestAmount"
的列那么有没有一种方法可以在使用注释或其他东西进行映射时引用正确的列名?我们也在使用 Entity Framework。
var connection = DbContext.Database.Connection.ConnectionString;
using (SqlConnection sqc = new SqlConnection(connection))
{
sqc.Open();
using (SqlBulkCopy bcp = new SqlBulkCopy(sqc))
{
bcp.DestinationTableName = strTargetTable;
sourceData.Columns.Cast<DataColumn>().ToList().ForEach(x =>
bcp.ColumnMappings
.Add(new SqlBulkCopyColumnMapping(x.ColumnName, x.ColumnName)));
bcp.BatchSize = 50000;
bcp.BulkCopyTimeout = 12000;
bcp.WriteToServer(sourceData);
}
sqc.Close();
}
经过进一步调查,我们将列映射存储在 table 中,因此 table 看起来像这样
TableName: ColumnMappingTable
[ColumnName] [GuiColumnName]
IntAmt InterestAmount
PrinAmt PrincipalAmount
也就是说,有没有一种方法可以动态映射这种方式? 我们有很多 table 并且在代码中单独硬编码映射每个名称会花费很多时间
尝试使用 TableMappings.Add()
Article供参考:
在定义db对象的class中添加SqlBulkCopyColumnMapping类型的IEnumerable
public static IEnumerable<SqlBulkCopyColumnMapping> GetObjectNameColumnMappings()
{
return new[]
{
new SqlBulkCopyColumnMapping(nameof(propertyName), "dbColumnName"),
new SqlBulkCopyColumnMapping(nameof(propertyName2), "dbColumnName2")
};
}
然后调用此方法并将其设置为等于您的列映射
using (SqlBulkCopy bcp = new SqlBulkCopy(sqc))
{
bcp.DestinationTableName = strTargetTable;
bcp.ColumnMappings = classInstance.GetObjectNameColumnMappings();
bcp.BatchSize = 50000;
bcp.BulkCopyTimeout = 12000;
bcp.WriteToServer(sourceData);
}