1

嗯...我是一个n00b,我知道。这是非常直接的。

基本上这是我一直在写的代码。

rstSwift.MoveFirst
Do While Not rstSwift.EOF
    If Left(rstSwift!Date, 2) & Mid(rstSwift!Date, 4, 2) & Right(rstSwift!Date, 4) = fromdate Then
        INSERTFUNCTIONHERE
    Else
    End If
    rstSwift.MoveNext
Loop

我最近提出了一个关于 SQL 的问题,似乎它确实为我的问题提供了很多解决方案......你看,我当前的数据库大约有 +15000 个条目 - 每次我需要查询所有与一天需要一段时间 - 毕竟,我要求它在整个数据库中执行循环。

现在,我注意到这样做可能有点愚蠢-嗯,这是我能想到的唯一方法-我的主要问题是:

我可以用“do while not”代替 SQL 查询吗?像

NEWTABLEVARIABLE = SELECT * from rstSwift WHERE rstSwift.Date = '20/11/2011';
NEWTABLEVARIABLE.MoveFirst
Do While Not NEWTABLEVARIABLE.EOF
INSERTFUNCTIONHERE
NEWTABLEVARIABLE.MoveNext
Loop

在这个查询的结果上,运行代码?它会比我当前的代码更快吗?即使它不是更快 - 它是否更慢?因为编写单个选择参数似乎比处理 While-Loop 情况要容易得多......

4

2 回答 2

3

目的应该是完全消除循环。

假设您INSERTFUNCTIONHERE将列data_col增加 1: 而不是:

rstSwift.MoveFirst
Do While Not rstSwift.EOF
    If Left(rstSwift!swift_date, 2) & _
          Mid(rstSwift!swift_date, 4, 2) & _
          Right(rstSwift!swift_date, 4) = fromdate Then
        rstSwift!data_col = rstSwift!data_col + 1
        rstSwift.Update
    End If
    rstSwift.MoveNext
Loop

相反,用 SQL 重写整个操作,例如

CREATE PROCEDURE IncrementSwifts
(
 :fromdate DATETIME
)
AS
UPDATE Swifts
   SET data_col = data_col + 1
 WHERE swift_date = :fromdate;

然后在 VBA 中,使用 Command 对象执行 proc,使用 Parameter 对象传入fromdate值。

于 2011-11-30T09:36:44.997 回答
2

是的,您可以在数据库端完成过滤。当您打开记录集时,您将传递您指定的查询。像这样的东西:

set rstSwift = connMyDbConnection.Execute("SELECT * from rstSwift WHERE rstSwift.Date = #20/11/2011#")
Do While Not rstSwift.EOF
   INSERTFUNCTIONHERE
   rstSwift.MoveNext
Loop

编辑:
使用 Database.OpenRecordset() 方法时,请使用此语法而不是上述语法:

set rstSwift = mdb.OpenRecordset("SELECT * from rstSwift WHERE rstSwift.Date = #20/11/2011#")
Do While Not rstSwift.EOF
   INSERTFUNCTIONHERE
   rstSwift.MoveNext
Loop

它可能会比您当前使用的更快,具体取决于有多少记录与过滤器匹配。

警告:
如果您修改要根据某种输入动态创建的查询,我提供的示例可能容易受到 SQL 注入攻击。始终确保在运行 SQL 之前清理它。

于 2011-11-29T18:12:27.500 回答