我知道我可以通过不指定如
here所述的sqlBulkCopyOptions.KeepIdentity来使用标识列批量插入到我的表中.
我希望能够获得服务器生成的标识值并将它们放在我的数据表中,甚至是列表中.我看过this帖子,但我希望我的代码是通用的,我的所有表格中都没有版本列.任何建议都非常感谢.这是我的代码:
public void BulkInsert(DataTable dataTable,string DestinationTbl,int batchSize) { // Get the DataTable DataTable dtInsertRows = dataTable; using (sqlBulkCopy sbc = new sqlBulkCopy(sConnectStr)) { sbc.DestinationTableName = DestinationTbl; // Number of records to be processed in one go sbc.BatchSize = batchSize; // Add your column mappings here foreach (DataColumn dCol in dtInsertRows.Columns) { sbc.ColumnMappings.Add(dCol.ColumnName,dCol.ColumnName); } // Finally write to server sbc.WriteToServer(dtInsertRows); } }
解决方法
AFAIK,你做不到.
获取身份字段值的唯一方法(我知道)是在逐行插入时使用SCOPE_IDENTITY();或者在插入整个集合时使用OUTPUT方法.
“最简单”的方法可能是你将sqlBulkCopy记录在表中,然后再将它们取回.问题可能是很难正确(并且快速)再次从服务器获取这些行. (例如,使用IN(guid1,guid2,..,guid999998,guid999999)=的WHERE子句会相当丑陋(而且很慢)
我假设性能是一个问题,因为你已经在使用sqlBulkCopy,所以我建议采用OUTPUT方法,在这种情况下,你首先需要一个临时表到sqlBulkCopy您的记录.所述表应该包括某种批量标识符(GUID?),以允许多个胎面并排运行.你需要一个存储过程来INSERT< table>插入OUTPUT.*将登台表中的数据选择到实际目标表中,并再次清理登台表.然后,来自所述程序的returend记录集将1:1匹配到负责填充临时表的原始数据集,但是当然你不应该依赖它的顺序.换句话说:您的下一个挑战是将返回的标识字段与应用程序中的原始记录进行匹配.
思考的事情,我会说在所有情况下 – 除了逐行和& SCOPY_IDENTITY()方法,这将是狗慢 – 你需要(或添加)一个’键’到您的数据,以将生成的ID链接回原始数据= /