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
如果SQL语句没有找到任何';匹配项';在桌子上?_Sql_Ms Access_Vbscript - Fatal编程技术网

如果SQL语句没有找到任何';匹配项';在桌子上?

如果SQL语句没有找到任何';匹配项';在桌子上?,sql,ms-access,vbscript,Sql,Ms Access,Vbscript,使用MS Access,我尝试运行SQL语句,但在表还没有记录的情况下,我无法使其工作。我会感谢你的帮助!谢谢 Public Function GetReferenceID(RefCode As String) As Integer Dim RefID As Integer Dim rec As Recordset Call connectDB sSQL = "select RefID from Exceptions where RefCode = '" &am

使用MS Access,我尝试运行SQL语句,但在表还没有记录的情况下,我无法使其工作。我会感谢你的帮助!谢谢

Public Function GetReferenceID(RefCode As String) As Integer
    Dim RefID As Integer
    Dim rec As Recordset

    Call connectDB
    sSQL = "select RefID from Exceptions where RefCode = '" & RefCode & "'"
    Set rec = CurrentDb.OpenRecordset(sSQL)

    If (Not rec.EOF And Not rec.BOF) Then
        RefID = rec.RecordCount + 1
    Else
        RefID = 1
    End If
    GetReferenceID = RefID 
End Function

Private Sub RefCode_Change()
    Dim tr As Transactions, rID As Integer
    Set tr = New Transactions
    tr.GetReferenceID (RefCode.Value)
end sub

更新!此行有错误(运行时错误3464,“条件表达式中的数据类型不匹配”):

…在此代码中:

Private Sub RefCode_Change()
        Dim rec As Recordset, RefID As Integer
        sSQL = "select RefID from Exceptions where RefCode = '" & RefCode.Value & "'"
        Set rec = CurrentDb.OpenRecordset(sSQL)

        If (rec.EOF And rec.BOF) Then
            RefID = 1
        Else
            rec.MoveFirst
            RefID = rec.RecordCount + 1
        End If
End Sub

我想你想这么做

If (rec.EOF And rec.BOF) Then
    'empty recordset
    RefID = 1
Else
    'at least one row
     rec.movefirst
     RefID = rec.RecordCount + 1
End If
您还可以将所有这些简化为

RefID = Dcount("*","Exceptions","refCode='" & RefCode & "'") +1

我不完全确定问题是什么,但我看到两个潜在问题:

  • 您尚未指定记录集声明,因此可能会遇到DAO和ADO记录集类型之间的歧义。相反,将记录集变量声明为
    Dim rs as DAO.recordset
    Dim rs as ADOX.recordset
    (我认为后者是正确的——我从不使用ADO,所以不必指定它!)。
    Set rec=CurrentDb.OpenRecordset(sSQL)
    返回的数据类型不匹配这一事实强烈地表明您声明了ADO记录集,因为这将导致与CurrentDb.OpenRecordset()返回的DAO记录集不匹配

  • 在遍历整个记录集之前,无法保证DAO记录集返回准确的记录计数。由于Jet/ACE的Rushmore技术,记录集的开头被传递,而结尾仍被检索。您可以等待一段时间,希望Recordcount是准确的,或者您可以显式地生成rs.MoveLast,在这种情况下,Recordcount将保证是准确的


  • 使用参数化SQL避免SQL注入攻击。如果有人向您提供的RefCode为“”;drop table Exceptions;--“?如果有人向您提供的RefCode为“”;drop table Exceptions;”,Access数据库引擎将不会执行drop table。@HansUp:尝试以下操作:使用参数化SQL以避免错误(例如,当RefCode.Value包含单引号时)为了避免Access中的
    WHERE
    子句SQL注入(例如,如果有人向您提供
    ”或“=”
    ?@Ali:您似乎假设RefID将是一个完美的序列,即MAX(RefID)=COUNT(*)、MIN(RefID)=1,无差距等。我打赌您在此表上没有约束,以确保您的假设始终正确。但是,与其添加这些约束,我敦促您改为采用不同的方法来生成标识符。@有一天,为了澄清这一点,我没有反对参数。我的观点只是“drop trable…”Access数据库引擎没有风险。Refcode是一个字符串字段。您知道我应该如何解决此问题吗?
    RefID = Dcount("*","Exceptions","refCode='" & RefCode & "'") +1