1

我有一个大型数据库,并希望实现一个允许用户批量更新信息的功能。用户下载一个 excel 文件,进行更改,系统接受该 excel 文件。

  1. 用户使用 Web 界面 (ASP.NET) 将数据从数据库下载到 Excel。
  2. 用户修改 Excel 文件。仅允许将某些数据作为其他映射修改到数据库中。
  3. 一旦用户对他们的更改感到满意,他们就会通过 ASP.NET 界面上传更改后的 Excel 文件。
  4. 现在服务器的工作是从 Excel 文件中提取数据(使用 Gembox)并根据数据库验证数据(这是我遇到问题的地方)
  5. 验证完成后,验证结果将显示在另一个 ASP.NET 页面上。验证是软的,因此只有在缺少映射到 DB 的索引时才会发生硬失败。(缺少数据会导致忽略等)
  6. 用户可以决定将要采取的行动是否适当,在接受这些行动时,系统将应用更改。(添加、修改或忽略)

在应用用户所做的更改和/或添加之前,必须验证数据以避免用户出错。(他们无意删除的日期)

对于需要更新以达到超过 65k 的行来说,这并不遥远。

问题是:解析数据以进行验证并建立更改和添加集的最佳方法是什么?

如果我将必须验证 excel 数据的所有数据加载到内存中,我可能会不必要地影响已经占用大量内存的应用程序。如果我对 excel 文件中的每个元组进行数据库命中,我将看到超过 65k 的数据库命中。

帮助?

4

4 回答 4

3

我过去见过的方法是:

  1. 将用户的数据批量加载到数据库中的“临时”表中。
  2. 通过单个存储过程(执行一系列查询)验证临时表中的数据,标记验证失败的行,需要更新等。
  3. 根据需要对标记的行进行操作。

这对于验证缺失的列、有效的键值等非常有效。它对于检查单个字段的格式不太好(不要让 SQL 将字符串分开)。

正如我们所知,有些人对将业务逻辑放在数据库中感到不舒服,但这种方法确实限制了您的应用程序对数据库的访问次数,并且避免了一次将所有数据保存在内存中。

于 2009-02-12T02:49:10.913 回答
1

您的问题在数据仓库系统中很常见,其中批量上传和数据清理是(常规)工作的核心部分。我建议你在 ETL(提取变换负载)、临时表周围搜索一下,你会发现很多好东西。

在广泛回答您的问题时,如果您确实“将数据加载到内存中”进行检查,那么您实际上是在自己的代码中重新实现了数据库引擎的一部分。现在,如果这样做更快更聪明,那可能是一件好事。例如,您的 Excel 提取可能只有一小部分有效日期,因此您无需加入表格来检查日期是否在范围内。但是,对于外键等其他数据,让数据库做它擅长的事情。

随着数据量变大,使用临时表/数据库/服务器是一种常见的解决方案。顺便说一句,允许用户在 Excel 中清理数据是一个非常好的主意,允许他们“意外”删除关键数据是一个非常糟糕的主意。您能否锁定单元格/列以防止这种情况发生,和/或在 Excel 中进行一些基本验证。如果一个字段应该被填写并且应该是一个日期,你可以在几行 Excel 中检查它。您的用户会很高兴,因为他们不必在发现问题之前上传。

于 2009-02-12T03:20:40.853 回答
0

为了正确回答这个问题,以下信息将很有用

  1. 您将如何通知用户失败?
  2. 一次验证失败会导致加载 64,999 条记录还是不加载?
于 2009-02-12T02:22:09.433 回答
0

首先使用批量上传将文本文件数据存储在临时表中。然后检索它,并使用您制作的界面进行验证。并在验证后将其存储在主表或数据库中

于 2009-04-03T07:06:23.453 回答