Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 无效参数错误:MSAccess和SQL_Ms Access_Vba - Fatal编程技术网

Ms access 无效参数错误:MSAccess和SQL

Ms access 无效参数错误:MSAccess和SQL,ms-access,vba,Ms Access,Vba,我试图从MSAccess访问SQL数据库中的某些行,但这一行上不断出现无效参数错误: Set rs = CurrentDb.OpenRecordset("SELECT TimeID " & _ "FROM tblLunchTime " & _ "WHERE ProductionID = prodSelect AND EndTime is NULL AND StartTime < dateAdd('h', 3, NOW())", [dbSeeChanges])

我试图从MSAccess访问SQL数据库中的某些行,但这一行上不断出现无效参数错误:

Set rs = CurrentDb.OpenRecordset("SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = prodSelect AND EndTime is NULL AND StartTime < dateAdd('h', 3, NOW())", [dbSeeChanges])
这有什么不对吗

Private Sub cmdClockEnd_Click()

'Check if a group has been selected.
If frmChoice.value = 0 Then

    MsgBox "Please select a production line."

    End

End If

'Setup form for user input.
lblEnd.Visible = True

'Save end of lunch value.
lblEnd.Caption = Format(Now, "MMM/DD/YY hh:mm:ss AMPM")

'Declare database variables.
Dim dbName As DAO.Database
Dim strValuesQuery As String
Dim rs As DAO.Recordset
Dim prodSelect As String
Dim sSQL As String
Dim timeValue As String
Set dbName = CurrentDb

'Get values of Production Line.
If frmChoice.value = 1 Then

prodSelect = "L2"

ElseIf frmChoice.value = 2 Then

prodSelect = "L3"

End If

'Get the last TimeID with the following parameters.
sSQL = "SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = prodSelect AND EndTime is NULL AND StartTime < #" & DateAdd("h", 3, Now()) & "#"

Set rs = dbName.OpenRecordset(sSQL, dbSeeChanges)

strValuesQuery = _
                    "UPDATE tblLunchTime " & _
                    "SET EndTime = '" & Now & "'" & _
                    "WHERE TimeID = " & rs![TimeID] & " "

'Turn warning messages off.
DoCmd.SetWarnings False

'Execute Query.
DoCmd.RunSQL strValuesQuery

'Turn warning messages back on.
DoCmd.SetWarnings True

End Sub

您需要将prodSelect置于引号之外:

"WHERE ProductionID = " & prodSelect & " AND ...
几乎总是最好说:

sSQL="SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = " & prodSelect & _
    " AND EndTime is NULL AND StartTime < dateAdd('h', 3, NOW())"
''Debug.print sSQL
Set rs = CurrentDb.OpenRecordset(sSQL)
您可以看到使用Debug.Print的优势

啊哈,选择是文本!你需要报价

sSQL="SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = '" & prodSelect & _
    "' AND EndTime is NULL AND StartTime < dateAdd('h', 3, NOW())"

我想我也会在客户端执行日期标准连接,因为这是另外一件可能出错的事情:

  "...StartTime < #" & DateAdd("h", 3, Now()) & "#"

我不知道SQL Server没有DateAdd和Now功能,也不知道它们的行为与Access中的行为不完全相同,但我不会冒险——我会在客户机上进行此计算,而不是将其交给服务器。

对于tblLunchTime,似乎存在混淆。。。它是本机Jet/ACE表还是指向另一个数据库中的表的链接。请向我们显示此命令的输出:

Debug.Print CurrentDb.TableDefs("tblLunchTime").Connect
您可以将该行粘贴到即时窗口中,然后按enter键显示响应。您可以使用CTRL+g组合键打开即时窗口

万一响应以ODBC开头,建议您在代码中尝试这一行:

Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges)
更新:现在你已经越过了这个障碍,建议你用更新声明改变你的方法。不要关闭警告;请尝试以下方法:

'Execute Query. '
CurrentDb.Execute strValuesQuery, dbFailOnError

并添加一个错误处理程序来处理dbFailOnError捕获的任何错误。

什么是prodSelect?它的定义是什么?这是我对问题的第一个猜测。你是说ProductionID=&prodSelect&和?prodSelect是窗体上选定的切换按钮。Dim prodSelect作为字符串prodSelect=frmChoice.valueprodSelect是文本,因此您需要引号,请参见下面的我的答案。否。仍然有无效参数。请参阅编辑。检查生成的SQL字符串,甚至可以将其粘贴到查询设计窗口SQL视图中。什么是sSQL?我应该将其声明为什么?尝试设置rs=CurrentDb.OpenRecordSetSql,dbSeeChanges这似乎也可以:设置rs=CurrentDb.OpenRecordSetSql,选项:=dbSeeChanges我在通过ODBC使用SQL Server编程Access时收到通知,我的记录集需要使用dbSeeChanges选项打开。我不知道为什么,或者它有什么作用,但是没有它我的记录集就无法工作。我已经使它成为针对SQL Server创建记录集的正常部分。较新的SQL Server本机客户端可能不再需要它-我不知道,因为我所有的SQL Server项目都是较旧的版本。@BioXHazard如果你在18小时前阅读了我的链接和评论,那就容易多了。正如我所说,我做到了。但我在它崩溃访问后,以及SQL语句中的情况开始发生变化时删除了它。很抱歉