C# 在具有父子关系的表中批量插入数据
我正在处理一个函数,该函数将在具有父子关系的表中插入数据。我当前的实现是迭代对象以逐个插入它们。我正在考虑批插入,以减少使用SQL、C或PetaPoco的数据库往返。有人有主意吗C# 在具有父子关系的表中批量插入数据,c#,sql,sql-server,c#-4.0,petapoco,C#,Sql,Sql Server,C# 4.0,Petapoco,我正在处理一个函数,该函数将在具有父子关系的表中插入数据。我当前的实现是迭代对象以逐个插入它们。我正在考虑批插入,以减少使用SQL、C或PetaPoco的数据库往返。有人有主意吗 PersonID ParentID LastName FirstName 1 (null) John Doe 2 1 Mary Doe 3 1 Ken
PersonID ParentID LastName FirstName
1 (null) John Doe
2 1 Mary Doe
3 1 Ken Doe
4 2 Jane Doe
您可以在对数据进行迭代时收集数据,并对多行执行一次插入
INSERT INTO Persons
(PersonID,
ParentID,
Lastname,
Firstname)
VALUES (1,
null,
'John',
'Doe'),
(2,
1,
'Mary',
'Doe'),
...;
例如,创建一个名为TableB的具有相同结构的工作表
将您的数据插入c中的TableB,您可以使用datatable和SqlBulkCopy获得最佳性能,请看
将工作表中的数据插入到最终表中,但将列parent设置为null,如下所示:
在表格中插入人名、姓、名
从表格A中选择PersonID、LastName、FirstName
使用工作表更新父id
更新f1
设置f1.parentid=f2.parentid
从表格A f1内部连接f1上的表格B f2。PersonID=f2.PersonID
注1:3。四,。如果要在出错时回滚,则应在同一事务中
注2:在Microsoft为SqlBulkCopy提供的示例中,它们构建了datatable的结构,但您可以使用dataset对象执行“select top 0*from tableA”,并获取此表的datatable
注3:您可以使用sqlbulkcopy方法直接插入到最终的表中,因为在我看来,该方法禁用了约束,但这确实很危险。。。约束的存在是有原因的。没有清除实际要执行的操作-您不清楚哪个部分?也许您可以使用存储过程来执行插入。将父项加上所有子项作为表值参数传递给SP。因此,为每个家长+孩子调用一次SP Squirre是正确的,TVP是正确的方法。你甚至不需要SP——你从来没有真正需要SP,因为它不会增加新的功能。只需执行类似insert into dbo.SomeTable select*from@tableParameter的操作,并使用正确的表参数即可。如果personId存在,则要插入的数据都是新的,并且personId为空,则代码正常工作。上面的数据只显示了表的示例结构。另一件事是,数据上有一个层次结构,因此它们依赖于先前插入的记录。@crisgomez整个表一次插入,因此依赖性不是问题。但是,将数据作为一个巨大的文本发送不是一个好主意,解析开销会很糟糕。