使用access vba计算sql查询结果中的行数

时间:2014-04-21 07:38:21

标签: sql vba ms-access ms-access-2007 access-vba

我正在尝试使用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(参数太少)

1 个答案:

答案 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正常工作,您就可以检查记录集是否为空。如果为空,则BOFEOF属性均为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

注意:

  1. 我使用了AGN.Value而不是AGN.Text,因为.Text属性仅在控件具有焦点时才可访问。但是我不知道你在哪里使用那个检查代码,所以不确定哪个是你的正确选择。
  2. 请注意SELECT查询与DCount选项之间的相似之处。在两者之间翻译通常很容易。