c# – 如何在使用SqlBulkCopy时检索服务器生成的标识值

我知道我可以通过不指定如 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链接回原始数据= /

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...