我正在尝试使用access 2007 vba计算sql查询结果中的行数。
我所拥有的是一个名为AGN
的文本框,当用户为其设置值时,检查该值,然后如果已插入该值,则返回MsgBox
。我尝试做的是:
Dim rs As DAO.Recordset
Dim db As Database
Dim strSQL As String
Set db = CurrentDb
strSQL = "SELECT agencies.[agency no] FROM agencies WHERE agencies.[agency no]= " &Me.AGN.Text
Set rs = db.OpenRecordset(strSQL)
If rs.Fields.Count > 1 Then
MsgBox "this value is already here "
End If
Set rs = Nothing
当我在文本框中插入任何值时,我得到运行时错误3061(参数太少)
答案 0 :(得分:1)
“参数太少错误消息通常意味着您的SQL语句中存在Access无法识别为字段,表,函数或SQL关键字的内容。在这种情况下,如果[agency no]
是文本而不是数字数据类型,则可能会发生这种情况。如果是这种情况,请在构建SQL语句时用引号括起AGN
的值。 (或者您可以使用参数查询来避免引用文本值。)
strSQL = "SELECT a.[agency no] FROM agencies AS a" & vbCrLf & _
"WHERE a.[agency no]= '" & Me.AGN.Value & "'"
Debug.Print strSQL
如果遇到问题,请转到立即窗口并复制Debug.Print
的输出。然后,您可以在Access查询设计器中创建一个新查询,切换到SQL视图并粘贴到语句文本中进行测试。
一旦SELECT
正常工作,您就可以检查记录集是否为空。如果为空,则BOF
和EOF
属性均为true。因此,要检测不为空时,请检查Not (BOF And EOF)
...
With rs
If Not (.BOF And .EOF) Then
MsgBox "this value is already here "
End If
End With
但是,您实际上不需要打开记录集来确定是否存在匹配的行。您可以检查DCount
表达式返回的值。
Dim lngRows As Long
lngRows = DCount("*", "agencies", "[agency no]='" & Me.AGN.Value & "'")
If lngRows > 0 Then
MsgBox "this value is already here "
End If
注意:
AGN.Value
而不是AGN.Text
,因为.Text
属性仅在控件具有焦点时才可访问。但是我不知道你在哪里使用那个检查代码,所以不确定哪个是你的正确选择。SELECT
查询与DCount
选项之间的相似之处。在两者之间翻译通常很容易。