Access SQL查询在另一台计算机上失败

时间:2019-08-09 17:19:52

标签: sql ms-access access-vba

我有一个记录集,在我的Microsoft Access实例中工作正常,但是当我在另一台计算机上尝试该记录集时,它失败了。

我的Access应用程序的两个版本中都已经有很多记录集正在运行。两者都在Access 2010上,但是它们可能具有不同的驱动程序。

代码如下:

     Set rsWeek = CurrentDb.OpenRecordset("SELECT * FROM [Timecards] 
     WHERE employeeID = " & empID & " AND workDate BETWEEN #" & Me.Text23 
     & "# AND #" & Me.Text25 & "#", dbOpenSnapshot)

我使用了一个MsgBox来确认我所有的变量工作正常。该代码可在我的第一台计算机上按计划工作,但是第二个代码只是失败,并出现一般的“单击时”错误。

这似乎是BETWEEN部分的问题,因为这是我唯一一次使用BETWEEN。

第二台计算机是否需要某种SQL驱动程序才能运行带有BETWEEN的查询?

4 个答案:

答案 0 :(得分:2)

您必须将日期值设置为文本表示形式:

Set rsWeek = CurrentDb.OpenRecordset("SELECT * FROM [Timecards] 
WHERE employeeID = " & empID & " AND workDate BETWEEN #" & Format(Me!Text23.Value, "yyyy\/mm\/dd") & "# AND #" & Format(Me!Text25.Value, "yyyy\/mm\/dd") & "#", dbOpenSnapshot)

编辑:

如果您遵循了Albert的建议,但仍然失败,请尝试:

Set rsWeek = CurrentDb.OpenRecordset("SELECT * FROM [Timecards] 
WHERE employeeID = " & empID & " AND workDate BETWEEN #" & Format(DateValue(Me!Text23.Value), "yyyy\/mm\/dd") & "# AND #" & Format(DateValue(Me!Text25.Value), "yyyy\/mm\/dd") & "#", dbOpenSnapshot)

或者,如果文本框可以为空:

Set rsWeek = CurrentDb.OpenRecordset("SELECT * FROM [Timecards] 
WHERE employeeID = " & empID & " AND workDate BETWEEN #" & Format(Nz(Me!Text23.Value, Date()), "yyyy\/mm\/dd") & "# AND #" & Format(Nz(Me!Text25.Value, Date()), "yyyy\/mm\/dd") & "#", dbOpenSnapshot)

答案 1 :(得分:1)

如@ErikA在评论中所建议的那样,使用参数而不是在SQL语句中并置表单值将避免由于区域差异而引起的所有问题,并且还可以保护代码免受SQL injection的影响。

根据当前代码的内容考虑以下示例:

With CurrentDb.CreateQueryDef _
("", "select * from timecards t where t.employeeid = @id and t.workdate between @from and @to")
    .Parameters("@id") = empID
    .Parameters("@from") = DateValue(Me.Text23)
    .Parameters("@to") = DateValue(Me.Text25)
    With .OpenRecordset(dbOpenSnapshot)
        If Not .EOF Then
            .MoveFirst
            Do Until .EOF
                Debug.Print .Fields(0)
                .MoveNext
            Loop
        End If
        .Close
    End With
End With

上面只是显示记录集中第一个字段的值,只是为了演示该方法。

答案 2 :(得分:0)

请尝试这种方式,根据我的经验,效果更好。

Set rs = CurrentDb.OpenRecordset("query string", dbOpenDynaset, dbSeeChanges)

答案 3 :(得分:0)

ComputerVersteher通过指向to this issue指向了正确的方向。我尝试了“压缩和修复数据库”,这在第二台计算机上引发了错误。事实证明,我的第二台计算机“ Microsoft Windows公共控件6.0(SP6)”上缺少参考。之后,我执行了“压缩和修复”功能,然后再次对其进行了测试,然后它开始工作。我不能说我知道为什么它仅在一个查询中崩溃,但是问题现在消失了。

相关问题