【问题标题】:No value given for one or more required parameters adodb access error没有为一个或多个必需参数指定值 adodb 访问错误
【发布时间】:2020-09-30 15:44:09
【问题描述】:

我正在尝试通过 Excel 用户表单将我的数据库中的档案 ID 分配给相应的文件编号列。它应该在列中找到最大的字母数字字符串,并将其递增 1 并在归档 id 列中分配它。 这是 VBA 代码:

Sub Archival()

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Application.AutomationSecurity = msoAutomationSecurityLow
        Dim cnn As New ADODB.Connection 'dim the ADO collection class
        Dim rst As New ADODB.Recordset 'dim the ADO recordset class
        Dim dbPath As String
        Dim qry As String
        Dim qry2 As String
        
        dbPath = "\\share.company.net@SSL\DavWWWRoot\sites\FileNumberandLDS\Shared Documents\General\NewDB.accdb"
        
        cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & ";Jet OLEDB:Database"
        
        Set rst = New ADODB.Recordset 'assign memory to the recordset
        Set rs = New ADODB.Recordset
    
        qry = "SELECT * FROM FileNumbers WHERE [File_Number]= '" & ArchivalForm.txtFile.Value & "'"
        
        rst.Open qry, cnn, adOpenKeyset, adLockOptimistic
        
        If ArchivalForm.cmbRetention.Value = "A" Then
            qry2 = "SELECT max(val(mid(Archival_id,3))) FROM FileNumbers WHERE [Archival_id] ALIKE 'A%'"
            rs.Open qry2, cnn, adOpenKeyset, adLockOptimistic
            newfile = "A-" & (rs.Fields(0) + 1)
        End If
            
        If ArchivalForm.cmbRetention.Value = "C" Then
            qry2 = "SELECT max(val(mid(Archival_id,3))) FROM FileNumbers WHERE [Archival_id] ALIKE 'C%'"
            rs.Open qry2, cnn, adOpenKeyset, adLockOptimistic
            newfile = "C-" & (rs.Fields(0) + 1)
        End If
        
        With rst
            .Fields("Archival_id").Value = newfile
            .Fields("Remarks").Value = ArchivalForm.txtRemarks.Value
            .Fields("Retention Category").Value = ArchivalForm.cmbRetention.Value
            .Fields("Archived By").Value = Application.UserName
            .Fields("Archived On").Value = Date
            .Update
        End With
        'cnn.Execute "INSERT INTO TheTable.....", , adCmdText + adExecuteNoRecords
        'Set rs = cnn.Execute("SELECT @@Identity", , adCmdText)
    rst.Close
    rs.Close
    cnn.Close
    
    Set rs = Nothing
    Set rst = Nothing
    Set cnn = Nothing
    MsgBox ("The Archival id is " & newfile)
End Sub

我收到错误“没有为一个或多个要求提供值”:

rs.Open qry2, cnn, adOpenKeyset, adLockOptimistic

这是我的数据库的样子: [![在此处输入图片描述][1]][1]

请帮忙 [1]:https://i.stack.imgur.com/8baZa.png

【问题讨论】:

  • 试试:LIKE 'A*'LIKE 'C*'
  • 没有改变,显示同样的错误
  • 连接有效吗?您是否能够在没有过滤条件的情况下打开记录集?如果没有符合条件的记录并尝试生成第一个 Archive_ID,会发生什么情况?
  • 将前缀和序列保存在单独的字段中,生成序列的代码将被简化。你一步调试了吗?是否从记录集中提取值?
  • 连接有效,我对项目中的多个其他事物使用相同的连接代码,一切正常

标签: sql vba ms-access


【解决方案1】:

你有一个下划线代替空格

qry2 = "SELECT max(val(mid([Archival id],3))) FROM FileNumbers WHERE [Archival id] ALIKE 'A%'"
       

【讨论】:

  • 如果字段名实际上有下划线,则下划线是合适的。我确实看到下划线的使用不一致:Archival_ID、File_Number、保留类别、存档者、存档时间。建议不要在命名约定中使用空格。
  • @June7:但是,从屏幕截图来看,它没有。
  • 你是对的,我解决了这个错误。这是因为下划线。非常感谢您发现这个愚蠢的错误。但是我仍然卡住了,因为正在生成的档案 ID 是 A- 而不是 A-12348,我不知道为什么。所有其他字段都按应有的方式填充。
  • 检查rs.Fields(0)rs.Fields(0).Value的值。我猜它是 Null
  • 但不应该为空,列中有多个数据,格式为A-xxxxx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2017-12-25
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多