Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 Server中插入/更新大量行_C#_Sql_Sql Server - Fatal编程技术网

C# 使用C在SQL Server中插入/更新大量行

C# 使用C在SQL Server中插入/更新大量行,c#,sql,sql-server,C#,Sql,Sql Server,我必须解析一个大的XML文件,并将其数据导入到具有外键约束的各种表中 所以我的第一个想法是:创建一个SQL insert/update语句列表,并使用SqlCommand.ExecuteOnQuery一次性执行它们 我发现的另一种方法是AMissico展示的: 在这里,我将逐个执行sql命令。没有人抱怨,所以我认为这也是一种可行的做法 然后我发现了SqlBulkCopy,但似乎我必须用我想要上传的数据创建一个DataTable。所以,每个表都有一个副本。为此,我可以创建一个数据集 我认为每个选项

我必须解析一个大的XML文件,并将其数据导入到具有外键约束的各种表中

所以我的第一个想法是:创建一个SQL insert/update语句列表,并使用SqlCommand.ExecuteOnQuery一次性执行它们

我发现的另一种方法是AMissico展示的: 在这里,我将逐个执行sql命令。没有人抱怨,所以我认为这也是一种可行的做法

然后我发现了SqlBulkCopy,但似乎我必须用我想要上传的数据创建一个DataTable。所以,每个表都有一个副本。为此,我可以创建一个数据集

我认为每个选项都支持SqlTransaction。每个表大约有100-20000条记录


您更喜欢哪个选项?为什么?

除非您必须这样做,否则不要使用C,这是一个巨大的开销,SQL本身可以更快更好地完成它
您说XML已经在数据库中了。首先,决定是用C还是用T-SQL处理它

C:您必须将所有数据来回发送一次,但对于复杂逻辑来说,C语言要好得多。取决于你做了什么,它可以快几个数量级。 T-SQL:无需将数据复制到客户端,但您必须接受T-SQL的功能和性能配置文件。 根据您的情况,一个可能比另一个快得多,但不清楚是哪一个

如果您想用C语言进行计算,可以使用一个streaming SELECT来读取数据,使用一个SqlBulkCopy来写入数据。如果您的写入不只是insert,请写入临时表,并执行尽可能少的DML语句来更新目标表,可能是一次合并

如果您想留在T-SQL中,请尽量减少执行的语句数量。使用基于集合的逻辑


所有这些都被简化/缩短了。我遗漏了很多考虑因素,因为它们对于堆栈溢出的答案来说太长了。请注意,最佳战略取决于许多因素。您可以在注释中提出后续问题。

xml文档实际上存储在xml列中。我将阅读xml文档的某些部分,并且必须参考文档的其他部分,并基于这些其他部分等等。参考文献很多。在某些情况下,我还必须根据xml元素的值来决定它们所属的位置。它不像你的参考文献中那样是一个简单的结构。那么,为什么你不能保存你的输出xml呢?我不需要xml结构,我需要其中的数据。我支持C。你说的是单选。你的意思是单线程阅读还是没有子查询?在多个线程上阅读有问题吗,同步问题放在一边?好的,我没有说清楚这一点。我的意思是,您应该避免每行发出一个SELECT的反模式。我经常看到这一点。只需一次查询所有数据。如果你能让它工作的话,你也可以在多线程上阅读。您需要以某种方式对数据进行分区,可能是按ID范围。PLINQ在这些方面非常好。这是我的计划。尽可能多地提前阅读/尽可能多地阅读。