从 CSV 批量插入到数据库 (C#) -> Web 应用程序中的最大行数?

发布于 2024-08-30 13:27:05 字数 277 浏览 5 评论 0原文

Web 应用程序 - C#、.Net、SQL 2k5。 我最近在另一个应用程序上使用了bulkinsert,我想尝试一下。

我将收到一个包含 1000 行的 CSV 文件,这很可能会在数据库中添加 500 000(即五十万)条记录。 我还不知道这笔巨额资金是否会取得良好的效果。我担心它会超时。

我还没有进行任何测试,但我很确定它最终会超时。

有没有办法让它不超时(我不知道......将bulkinsert分成1000块:D)或者我应该尝试做一些像BCP这样的事情,用SQL作业......

Web application - C#, .Net, SQL 2k5.
I recently used bulkinsert on an other application and I thought I would like to give it a try.

I am going to receive a CSV file with 1000 rows, which will most likely add 500 000 (that is five hundred thousand) records in the database.
I don't have any idea yet about this huge amount if it's going to work out well. I am afraid that it will time out.

I didn't do any testing yet, but I am pretty sure it would time out eventually.

Is there a way to make it not time out (I don't know ... split the bulkinsert into 1000 pieces :D) or I should try to do something like BCP, with a SQL job ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

¢蛋碎的人ぎ生 2024-09-06 13:27:05

我最近使用 C# 和 SqlBulkCopy 类开发了类似的批量插入功能。为了避免页面超时,我使用 ThreadPool(ThreadPool.QueueUserWorkItem 方法)进行异步处理。使用新的连接对象将上传状态添加到日志表中,以避免日志的事务回滚。然后使用“上传历史记录”页面在网站中报告此状态。

最好的解决方案是创建一个使用 BulkInsert 命令的过程。这是该过程的示例代码:

CREATE PROCEDURE [dbo].[usp_ExecuteBulkInsertTask]  
(  
 @dataFile   VARCHAR(255),  
 @bulkInsertFormatFile  VARCHAR(255),  
 @tableName  VARCHAR(255)  
)  
AS 
BEGIN
BEGIN TRY
DECLARE @SQL Varchar(4000)  

 SET @SQL = 'BULK INSERT ' + @tableName  + ' FROM ''' + @dataFile + ''' WITH (formatfile=''' + @bulkInsertFormatFile + ''', FIRSTROW=2)'  
 EXEC sp_sqlexec  @SQL
END TRY
BEGIN CATCH
 --error handling
END CATCH
END

I recently developed smiliar bulkinsert functionality using c# and SqlBulkCopy class. To avoid page timeout I did asynchornous processing using ThreadPool (ThreadPool.QueueUserWorkItem method). The upload status is added to a log table using a new connection object to avoid transaction rollback for logs. This status is then reported in the website using a Upload History page.

The best solution would be to create a procedure which uses BulkInsert command. Here is a sample code for the proc:

CREATE PROCEDURE [dbo].[usp_ExecuteBulkInsertTask]  
(  
 @dataFile   VARCHAR(255),  
 @bulkInsertFormatFile  VARCHAR(255),  
 @tableName  VARCHAR(255)  
)  
AS 
BEGIN
BEGIN TRY
DECLARE @SQL Varchar(4000)  

 SET @SQL = 'BULK INSERT ' + @tableName  + ' FROM ''' + @dataFile + ''' WITH (formatfile=''' + @bulkInsertFormatFile + ''', FIRSTROW=2)'  
 EXEC sp_sqlexec  @SQL
END TRY
BEGIN CATCH
 --error handling
END CATCH
END

实际上,拆分插入似乎是个好主意。
我会使用更大的块,比如 5000 或更多。

Actually, splitting insertion seems a good idea.
I would use bigger chunks, say 5000 or maybe more.

孤独患者 2024-09-06 13:27:05

我建议您不要尝试在单个 Web 服务调用中处理该文件。

  1. 创建一个上传操作来接受文件并将其保存在某个地方,并创建一个GetProgress操作来允许客户端检查加载进度/如有必要重试。
  2. 创建一个将执行实际工作的后台进程,如 Windows 服务。

-或者-

如果您创建一个 WF/WCF 工作流服务,您可以一次性完成这两项任务,您可以将其直接托管在 IIS 中,就像 Web 服务一样,但它可以执行多个操作。

I suggest you don't try to process the file in a single web service call.

  1. Create an upload operation to accept the file and just save it somewhere and a GetProgress operation to allow the client to check the load progress / retry if necessary.
  2. Create a background process which will do the actual work, like a windows service.

-or-

You may be able to do both in one swoop if you create a WF/WCF Workflow Service, which you can host directly in IIS, like a web service, but it can perform multiple operations.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文