Ms access 无效参数错误:MSAccess和SQL
我试图从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])
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语句中的情况开始发生变化时删除了它。很抱歉