Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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/1/database/9.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#_Database - Fatal编程技术网

C# 管理大量数据-存储过程或数据集或其他。。。?

C# 管理大量数据-存储过程或数据集或其他。。。?,c#,database,C#,Database,我有一个每天导入大量数据、数十万条记录的应用程序。 数据来自不同的来源。使用C#读取数据,然后批量插入数据库。 然后处理这些数据: 不同的表是链接的 生成新表 使用复杂的算法校正数据(某些表格的总数必须为零) 大多数处理都是在存储过程中完成的。 虽然C#中的一些复杂处理会更简单,但将数据提取到数据集中并重新注入数据集会大大降低速度。 您可能会问,为什么在将数据插入数据库之前不处理数据,但我认为在内存中操纵100000条记录是不实际的,并且基于SQLs集合的命令在创建大量记录时会有所帮

我有一个每天导入大量数据、数十万条记录的应用程序。
数据来自不同的来源。使用C#读取数据,然后批量插入数据库。

然后处理这些数据:

  • 不同的表是链接的
  • 生成新表
  • 使用复杂的算法校正数据(某些表格的总数必须为零)
大多数处理都是在存储过程中完成的。
虽然C#中的一些复杂处理会更简单,但将数据提取到数据集中并重新注入数据集会大大降低速度。
您可能会问,为什么在将数据插入数据库之前不处理数据,但我认为在内存中操纵100000条记录是不实际的,并且基于SQLs集合的命令在创建大量记录时会有所帮助。

这可能会引发使用存储过程的古老问题及其利弊。 (例如,如何对存储过程进行单元测试?)

作为回应,我希望了解您处理大量数据的经验以及如何解决问题。

我会使用SSI或DTS(假设您正在谈论MSSQL)。它们是为此目的而设计的,如果需要,可以与SPs配合使用

另一种选择是使用Perl预处理数据。尽管听起来像是一个wierd建议,Perl在这些场景中实际上速度非常快。我过去使用它在合理的时间内(即几天而不是几周)处理了数十亿条记录


关于“如何进行单元测试存储过程”,您可以像其他任何东西一样使用MBUnit进行单元测试。只有一点建议:数据的设置和回滚可能很棘手,您可以使用DTS事务或显式SQL语句。

在MSSQL中执行操作时,我通常必须同意Skliwz。SSI和DTS是一个不错的选择,但是如果您不熟悉这些技术,那么使用它们可能会很麻烦。但是,有一种替代方法允许您在C#中进行处理,并且仍然将数据保存在SQL Server中

如果您真的认为在C#中处理会更简单,那么您可能需要考虑使用a来创建。在SQL Server内部,您可以对CLR对象执行许多非常强大的操作,这将允许您在代码触及数据库之前编写和单元测试代码。您可以使用任何标准的单元测试框架(NUnit、MSTest)在VS中对CLR代码进行单元测试,并且您不必编写大量难以管理的设置和拆卸脚本


至于测试您的存储过程,我会认真研究一下。您的数据库不再是一个未经测试的功能黑洞:)

您处理数据的位置在很大程度上取决于您正在做什么。例如,如果您需要丢弃数据库中不需要的数据,那么您可以在C#代码中处理这些数据。然而,数据库中要处理的数据通常应该是“与实现无关”的数据。因此,如果其他人想要从Java客户机插入数据,数据库应该能够拒绝坏数据。如果你把这种逻辑放到你的C代码中,Java代码就不会知道它

有些人反对并说“但我永远不会为数据库使用另一种语言!”即使这是真的,也会有DBA或开发人员使用数据库,如果没有逻辑,他们会犯错误。或者,您的新C#开发人员会尝试插入数据,而不知道(或忽略)用C#编写的数据预处理器

简而言之,您在数据库中输入的逻辑应该足以保证数据正确无需依赖外部软件