Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在具有父子关系的表中批量插入数据_C#_Sql_Sql Server_C# 4.0_Petapoco - Fatal编程技术网

C# 在具有父子关系的表中批量插入数据

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

我正在处理一个函数,该函数将在具有父子关系的表中插入数据。我当前的实现是迭代对象以逐个插入它们。我正在考虑批插入,以减少使用SQL、C或PetaPoco的数据库往返。有人有主意吗

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整个表一次插入,因此依赖性不是问题。但是,将数据作为一个巨大的文本发送不是一个好主意,解析开销会很糟糕。