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



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

上下文

我们有一个ASP.NET网站,其中包含一个受限制的Admin部分。

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

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

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

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

我们在Azure上,所以我想我们可以访问Azure Blob、队列和网络作业。只是不确定这是否是一个已经解决了很多次的常见问题,并且有一些参考资料可以复习。

谢谢!

这很容易。我以前也遇到过这个问题。

长途:

1._上传文件。

2._拿着文件做你的验证

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

4._使用sql的本地块(没有ORMS,它非常简单快速)

注意:请确保webconfig已配置为支持重文件。

短程:使用SSRS创建一个包,该包采用csv并将字段映射到表

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

是的,这是一个已解决的问题。Azure上有很多工具可以用来实现这一点,你已经提到了其中的一些。您还可以启动一个外部应用程序来进行处理,也许可以使用消息队列。但你也可以完全在ASP.NET中完成。Scott Hanselman有一篇关于这个主题的很棒的博客文章。它可以归结为使用某种库,该库旨在安全地处理在没有HTTP上下文的情况下在ASP.NET中运行的风险,并且通常选择一种可以在应用程序崩溃后幸存的工具。像Quartz.NET和Hangfire这样的库。

从本质上讲,使用这些类型的库,您可以启动一项工作来进行处理,并且可以在处理完成后再进行检查。

在SSIS等单个工具中执行所有ETL过程。以后处理您的自定义ETL工具将是一场噩梦。或者您的网站可能会触发SSIS ETL。使您的网站将文件放置在SSIS可以拾取的位置。

Azure 的SSIS

如果您不想使用SSIS,但正在使用EF,则可以使用CsvHelper。要加快通过EF的导入,请将用于导入的dbContext的AutoDetectChangesEnabled设置为false。我已经使用过它,并且我的导入几乎是即时运行的,尽管我的数据包含不到10万条记录,并且在5到20列之间变化。

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

我在windows服务中使用ImportHandler,它还定义了一个自定义配置部分,在那里我可以定义它需要为它需要导入的每个文件传递给ImportHandler的所有细节(例如,从哪里获取csv文件,什么文件名模式映射到哪个实体类,它应该假设csv文件有头行吗,它应该从csv中修剪数据吗,等等),然后在后台运行导入。

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

最新更新