【问题标题】:Efficiency & Performance Requirement效率和性能要求
【发布时间】:2013-02-20 09:34:48
【问题描述】:

我在用户要填写的表单中有许多文本框,我想检查用户的输入是否存在于数据库中。类似于某些网站在您输入用户名时检查用户名的方式。如果后一个用户名存在于数据库中,则将其标记为绿色或带有复选框。

在我的例子中,用户必须填写整个表单,其中每个文本框代表表格中的不同列。检查数据库中是否存在该值的最佳方法是什么?这必须是最快的方法,因为我不能承受滞后。

这是我想采用的方法:

在用户开始输入数据之前,将在数据库上执行 SQL 查询以检索该表中的所有记录(简单的SELECT * FROM table)。接下来,这将被保存在 DataTable 中。

当用户在文本框中输入文本后(即相应的文本框未聚焦),将检查表单中的所有文本框以查看它们的输入是否存在于数据库中。这将通过针对每个文本框的 DataTable 运行 LINQ 语句来执行,以查看该值是否包含在 DataTable 中。

这种方法行得通吗?我希望它尽可能快,并且不能容忍任何滞后。

【问题讨论】:

    标签: c# .net sql sql-server wpf


    【解决方案1】:

    如果table 中的行数不太大,我会使用这种方法。
    如果数字太大而无法合理地将它们保存在内存中,则您必须每次都访问数据库。
    您可以进行以下优化:

    1. 为需要搜索的每一列添加索引。请注意,这会增加向该表添加行所需的时间
    2. 仅在数据库中搜索实际更改的文本框
    3. 在搜索数据库时,以文本框旁边的小微调器的形式向用户提供视觉反馈。

    【讨论】:

    • 感谢您的意见。不幸的是,行数是在运行时确定的,因此可能会有非常多的行,也可能是很少的行。该软件可用于任何数据库。
    • 不幸的是,第一步是不可能的,因为应用程序不应该能够修改数据库,而只能“读取”它们。第二种方法会很棒,但是我将如何实现哪些文本框已更改?为了给问题添加更多上下文,可以有无限数量的文本框,因为用户可以随意添加它们。所以情况比标准形式要复杂一点
    • @DotNET:你知道哪个文本框没有聚焦。这就是改变的那个。
    • 感谢您的帮助。我会采用这种方法。虽然仍然查询DataTable而不是数据库不是更好吗?
    • @DotNET:当然,那样会更好。但它最多只能有一定数量的行。如果超过该阈值,内存消耗将太高,而用户响应时间的增益非常小。只要用户看到正在发生的事情,他们就可以稍等片刻。此外,用户必须等待 2 秒才能验证名字有什么问题?在那个时候他可以填写姓氏。
    【解决方案2】:

    我建议不要一次检查所有字段。 只要字段被填满,我会考虑缩小数据范围的方法。

    让我解释一下。假设您在DataTable 中有 10000 条用户记录。在用户完成填写第一个字段(通常是“名字”)后,然后仅使用您的数据库检查此列(SELECT users.firstName FROM table),然后您可以根据结果更新您的DataTableSELECT * FROM table WHERE firstName like ('%firstNameField%'))。

    您只能对已加载数据的字段执行此操作,它们可以为您节省一些额外的时间。

    希望你理解这个想法:)

    【讨论】:

    • 感谢您的意见。然而,直接查询数据表而不是数据库不是更好吗?
    • 行数是在运行时确定的,所以行数可能非常多,也可能很少。这是因为该软件可以与任何数据库一起使用。
    • 所以也许你是对的,最好直接查询DataTable。
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 2014-07-13
    • 2021-06-21
    • 1970-01-01
    • 2013-03-17
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多