[英]SQL Bulk Copy mapping with different column names?
我們的表中有幾列不是用戶友好名稱,因此我們在實際的 GUI 中更改它們。
例如,數據庫中的一列被標記為“IntAmt”,但用戶沒有任何線索,因此在程序中我們將此列稱為“利息金額”。
問題是,如果我使用如下所示的直接列映射,則會因為這些列不匹配而出錯。 數據庫中沒有名為“InterestAmount”的列
那么有沒有一種方法可以在帶有注釋或其他東西的映射中引用正確的列名? 我們也在使用實體框架。
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();
}
經過進一步調查,我們將列映射存儲在表中,因此該表如下所示
TableName: ColumnMappingTable
[ColumnName] [GuiColumnName]
IntAmt InterestAmount
PrinAmt PrincipalAmount
所以說有沒有一種方法可以動態映射這種方式? 我們有很多表和硬編碼在代碼中單獨映射每個名稱會花費很多時間
在定義db對象的類中添加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);
}
嘗試使用TableMappings.Add()
文章以供參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.