Jam*_*ard 25 .net c# sql-server sqlbulkcopy
我们需要根据父表中的Identity主键更新几个具有父/子关系的表,父表由一个或多个子表作为外键引用.
我们在F#中的原型显示了许多承诺,性能提高了34倍,但此代码强制在父表中使用已知的Identity值.如果没有强制,当SqlBulkCopy插入行时,Identity列会在数据库中正确生成,但Identity值不会在内存中的DataTable中更新.此外,即使它们是,也不清楚DataSet是否能正确地修复父/子关系,以便随后可以用正确的外键值写入子表.
任何人都可以解释如何让SqlBulkCopy更新Identity值,以及如何配置DataSet以保留和更新父/子关系,如果在单个DataTables上调用DataAdapter到FillSchema时不自动完成.
我不想要的答案:
类似于以下未回答的问题:
首先:SqlBulkCopy不可能做你想要的.顾名思义,它只是一条"单行道".我尽可能快地将数据移动到sql server中.它是旧的批量复制命令的.Net版本,它将原始文本文件导入表中.因此,如果您使用SqlBulkCopy,则无法获取标识值.
我做了很多批量数据处理,并且多次遇到过这个问题.解决方案取决于您的体系结构和数据分布.以下是一些想法:
为每个线程创建一组目标表,在这些表中导入.最后加入这些表格.其中大部分都可以通过一种非常通用的方式实现,您可以从名为TABLENAME的表中自动生成名为TABLENAME_THREAD_ID的表.
将ID生成完全移出数据库.例如,实现生成ID的中央Web服务.在这种情况下,您不应该为每个调用生成一个ID,而是生成ID范围.否则,网络开销通常会变成瓶颈.
尝试为您的数据生成ID.如果可能的话,你的问题就会消失.快说不要说"不可能".也许您可以使用可以在后处理步骤中清理的字符串ID?
还有一点评论:使用BulkCopy时,因子34的增加会增加.如果要快速插入数据,请确保正确配置数据库.
我想您面临的权衡是 BulkInsert 的性能与身份的可靠性。
您可以暂时将数据库置于 SingleUserMode 来执行插入吗?
我在转换项目中遇到了非常类似的问题,其中我向非常大的表添加一个 Identity 列,并且它们有子表。幸运的是,我能够设置父源和子源的标识(我使用 TextDataReader)来执行 BulkInsert,并且同时生成父文件和子文件。
我还获得了您所说的性能提升,OleDBDataReader Source -> StreamWriter ...然后 TextDataReader -> SQLBulk