【问题标题】:Setting two rowsources in same procedure is terrible slow - Access 2010在同一过程中设置两个行源非常慢 - Access 2010
【发布时间】:2018-11-25 02:25:35
【问题描述】:

我有两个通过 vba 在单击事件上填充的列表框。表 'Project' 是一个 odbc 数据源,有 250 条记录。

List1.RowSource = "SELECT Name FROM Project WHERE ProjectID = " & ProjectID.Caption & " AND Year = " & ActualYear.Caption & " ORDER BY Name"

List2.RowSource = "SELECT ProjectShare FROM Project WHERE ProjectID = " & ProjectID.Caption & " AND Year = " & ActualYear.Caption & " ORDER BY Name"

到目前为止一切顺利。但是当我运行这段代码时,每次最多需要 30 秒才能完成。我想,好吧,这是因为 odbc 等等。但是当我只运行这段代码的一行时(不管是哪一行),它都快如闪电(0.1秒)。

怎么可能,一个查询需要 0.1 秒,两个查询需要 30 秒?我可以在这两行之间打断吗?顺便提一句。没有 odbc,无论多少行,一切都像魅力一样工作

【问题讨论】:

  • 很难说。您可能在那里遇到锁定问题。您可以将两个列表绑定到同一个记录集(同时拉入 NameProjectShare),并隐藏第一个列表中的第二列和第二个列表中的第一列.这可能会大大提高速度。如果您有兴趣,我可以分享代码作为答案。
  • 您可以在两行之间尝试 DoEvents。但 Erik 的建议要优雅得多,开销也更少。
  • @ErikvonAsmuth 两次使用相同的 SQL 字符串并没有改变任何东西。有没有其他方法可以将它们绑定到同一个记录集?
  • 是的,我只是分享代码

标签: sql ms-access vba odbc


【解决方案1】:

您可以通过手动创建记录集将两个列表框绑定到同一个记录集。这允许 Access 只查询一次表而不是同时查询两次,避免了任何锁定冲突,并且也倾向于避免其他问题。

这还允许您使用参数,修复字符串连接引入的任何错误。

Dim rs As DAO.Recordset
With CurrentDb.CreateQueryDef("", "SELECT Name, ProjectShare FROM Project WHERE ProjectID = p1 AND Year = p2 ORDER BY Name")
    .Parameters(0).Value= ProjectID.Caption
    .Parameters(1).Value = ActualYear.Caption
    Set rs = .OpenRecordset(dbOpenSnapshot) 'Snapshot because it won't be updated
End With
Set list1.Recordset = rs
Set list2.Recordset = rs

请注意,当重新查询绑定到带有参数的记录集的对象时,我会发生错误,因此如果发生这种情况,您可能需要使用字符串连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2013-11-01
    • 2021-12-19
    • 2011-06-27
    • 1970-01-01
    • 2011-02-16
    • 2022-12-08
    相关资源
    最近更新 更多