使用 C# 使用 SQL Table 验证上传的 excel 数据

Validate Uploaded excel data with SQL Table using C#

我有一个场景,其中上传的 excel 必须跨数据库验证 excel 之外的无效数据必须显示在网格中以供用户确认。 在用户确认后,excel 中唯一的有效数据必须在数据库中更新。 我完全可以实现上传、验证和显示在网格中。

场景:

Table 包含姓名、职位和公司等用户数据。

上传的 excel 中提供的名称字段必须在数据库中进行交叉验证。 如果任何名称不可用,则必须在网格中向用户显示数据。

按下 'Continue' 按钮时,必须忽略无效数据,只需要使用有效数据来更新 table。

我不想为此阅读上传的 excel 两遍。

excel 中可能有大量数据可供上传。所以这个操作必须尽可能快。 有没有更好的解决办法

您是说您希望程序阻止用户输入,这样您就不会执行两次代价高昂的操作?

一旦用户单击该按钮,第一段代码就是禁用该按钮和所有其他按钮。另外,最好添加一个加载图标或状态消息来明确这一点。然后,当操作完成后,重新启用相应的按钮。

听起来您正在尝试确定如何通过几次往返来持久保存数据。首先用户上传它。然后您可能必须将其呈现给用户,并且通过继续,他们实际上必须重新提交它,并且在第二次提交时,有效行存储在 table 中。

我同意您不希望用户重新提交电子表格。但是所有这些数据都需要保存在某个地方,以便在用户看到无效行后可以对其进行处理。

我会考虑在数据从 Excel 上传后立即将其存储在 SQL table 中。现在您可以对 table 中的数据执行验证并将行标记为有效或无效。如果您只是验证某些数据是否存在于其他查找 table 中,那么该验证可以通过存储过程批量完成。

现在您已经有了一组行,所有行都带有一些公共键,这些键将它们标识为属于特定的用户操作。现在您可以 return 无效行供用户确认它们将被忽略。当用户确认时,您将有效行迁移到 "real" table 并删除所有行。您还可以在一段时间后使这些行过期。如果用户在给定时间后仍未批准它们,则他们将需要重新上传。

这种方法的一个好处是您可以将此过程分解为不同的、更小的步骤,这有助于管理复杂性。一步执行初始上传。另一个 returns 一组无效行。另一个批准一组有效行。更小的步骤使维护和单元测试更容易。

另一个好处是您可以将该过程与 Excel 上传分离。也许在未来的某个时候,您会想要在 XML 中处理上传。只有第一步需要改变。一旦您的数据进入 table,它来自哪里就不再重要了。