我搜索了几个与SqlBulkCopy和ColumnMappings相关的帖子,但找不到解决方案。我正在使用C#ASP .NET MS VS 2010和SQL Server 2008 R2。
我一直在使用SqlBulkCopy来加载一个包含DataTable Source数据的登台表。我想在我的SqlBulkCopy对象中添加一个ColumnMappings属性,但由于我有这么多列,我试图避免列出我需要映射到DB staging表中列的所有500多列。
我需要使用ColumnMappings的原因是我必须删除并添加列,因此架构是动态的,这不是一个好的设计,但为了这个目的,我们的内部客户端可以理解风险。
我还将所有列名称捕获到一个集合中。我不认为ColumnMappings方法将集合作为源和目标。
我考虑过编写两个SqlBulkCopy对象来处理这个问题,但不确定它是否可行。另一种选择是使用T-SQL ..
处理此问题的最佳方法是什么,或者您建议我探索哪种解决方案?
--set the connection string
//
string strConn = ConfigurationManager.ConnectionStrings["CPDM"].ToString();
//
SqlConnection scCPDM = new SqlConnection(strConn);
//
//
--create the SqlBulkCopy opbject
//
SqlBulkCopy bulkcopy = new SqlBulkCopy(strConn);
bulkcopy.BulkCopyTimeout = 3000;
bulkcopy.DestinationTableName = "CPDE_STAGING";
//
--need a to map all column mappings + new columns
--looking to do something like this --> bulkcopy.ColumnMappings.Add(*,*);
--then this ----> bulkcopy.ColumnMappings.Add(new_column,new_table_column);
--for each new column
bulkcopy.WriteToServer(dtNewRaw);
答案 0 :(得分:2)
我最终使用它并且效果很好。
//sqlbulkcopy does a blind insert into the db table.
//we have to add a column mapping property to tell
//sqlbulkcopy how to map each column from source to destination correctly
foreach (string sColumn in columnNamesNew)
{
string sNewColumn = sColumn.Replace(' ', '_');
bulkcopy.ColumnMappings.Add(sColumn, sNewColumn);
}