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
C# 人们如何从ASP.NET网站将大量数据(ETL)导入数据库?_C#_Asp.net_Azure_Background_Etl - Fatal编程技术网

C# 人们如何从ASP.NET网站将大量数据(ETL)导入数据库?

C# 人们如何从ASP.NET网站将大量数据(ETL)导入数据库?,c#,asp.net,azure,background,etl,C#,Asp.net,Azure,Background,Etl,问题:我们希望对一些csv数据进行一些ETL(提取、转换、加载),该过程通过ASP.NET网站中的网页手动启动 上下文 我们有一个ASP.NET网站,其中包括一个受限的管理部分 在本节中,我们希望添加一个页面,允许用户单击按钮选择要导入Sql Server DB表的文件 其中一些文件可能包含很多行—500000行。(每行大约300-400个字符长,超过大约13个“列”…csv'd) 现在,导入这个可能需要一段时间。就像,我希望将文件内容上传到某个地方,然后启动一些后台任务 我想知道人们现在是怎么

问题:我们希望对一些csv数据进行一些ETL(提取、转换、加载),该过程通过ASP.NET网站中的网页手动启动

上下文

我们有一个ASP.NET网站,其中包括一个受限的
管理部分

在本节中,我们希望添加一个页面,允许用户单击按钮选择要导入Sql Server DB表的文件

其中一些文件可能包含很多行—500000行。(每行大约300-400个字符长,超过大约13个“列”…csv'd)

现在,导入这个可能需要一段时间。就像,我希望将文件内容上传到某个地方,然后启动一些后台任务

我想知道人们现在是怎么做的

我们在Azure上,所以我想我们可以访问Azure Blob、队列和Web作业。只是不确定这是否是一个已经被多次解决的常见问题,是否有参考资料可供审查


谢谢

这很容易。我以前也面临过这个问题

漫长的道路:

1.上传文件

2.uu获取文件并进行验证

3.转换为数据表(我真的不记得我使用的库的名称)

4.uu使用本机大量的sql(没有ORMS,它非常简单和快速)

注意:请确保网络配置已配置为支持重文件

短途:
使用SSRS创建一个包,该包接受csv,并将字段映射到表中。在SSIS等单一工具中执行所有ETL过程。以后处理定制ETL工具将是一场噩梦。或者您的网站可以触发SSIS ETL。让您的网站将文件放到SSIS可以拾取的位置


如果您不想使用SSI,但正在使用EF,则可以使用。要通过EF加快导入,请将用于导入的dbContext的
AutoDetectChangesEnabled
设置为
false
。我已经使用了这个,虽然我的数据包含不到100k条记录,并且在5到20列之间变化,但我的导入运行几乎是瞬时的

我写了一个有
ImportHandler
类的。此类有一个
ImportAsync
方法,该方法接受文件路径和其他参数,并在调用CsvHelper之前执行某些EF函数。但在您的情况下,您应该使用流读取器替换文件路径

我在windows服务中使用ImportHandler,它还定义了一个自定义配置部分,在该部分中,我可以为需要导入的每个文件定义它需要传递给ImportHandler的所有详细信息(例如,从何处获取csv文件、什么文件名模式映射到哪个实体类、是否假定csv文件具有标题行、是否从csv中修剪数据等)但您可以询问用户这些详细信息,然后在后台运行导入


使用这种方法,对于我需要处理的每个新导入文件,我只需编写entity类来接收它,如果后端表还不存在,EF将为我创建它。如果您希望验证导入的数据与数据库中其他数据的关系,您可以编写该文件,并在导入后调用它。

我将在告诉我你已经解决了CSV解析(使用CSV助手或类似工具)。但是你遇到的问题是,当正常的页面交互都在请求/响应生命周期中运行时,如何在网站中处理这个长时间运行的任务。但是解析一个大的CSV文件对于正常的请求/响应生命周期来说太长了

是的,这是一个已解决的问题。Azure上有很多工具可供您使用,您已经提到了其中的一些。您也可以启动外部应用程序来进行处理,也许可以使用消息队列。但您也可以完全在ASP.NET中进行处理。Scott Hanselman对此有自己的见解。它可以归结为使用某种libra它的设计目的是处理在没有HTTP上下文的情况下安全地在ASP.NET中运行的危险,并且通常选择一个能够在应用程序崩溃后生存的工具


基本上,使用这些类型的库,您可以启动一项工作来进行处理,然后在完成后再查看。

我也准备好使用CsvHelper,因此我完全了解您的意思。使用Dapper而不是EF。但不想使用windows服务:(希望在Azure中得到一些东西。没有理由你不能在WebAPI.bingo中使用上面的内容。这已经有了进展:)你是正确的:解析。这一切都已排序。你(再次)更正问题是在网站中处理长时间运行的任务。好的,我听说过Q和H,但我希望在Azure中利用类似的功能。我将阅读SH的帖子,稍后返回并提供更多信息。顺便说一句-感谢您的回答:)