首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Access 365 -对象所需的错误,将字符串传递给cmd.Parameters: Item在Collection中找不到

Access 365 -对象所需的错误,将字符串传递给cmd.Parameters: Item在Collection中找不到
EN

Stack Overflow用户
提问于 2022-08-16 18:47:53
回答 1查看 59关注 0票数 0

更新2:我呃..。可能忘了取消评论这一行..。

代码语言:javascript
复制
 If Not IsMissing(Arg1) Then
        cmd.CreateParameter(1, adVarChar, adParamInput) = Arg1 
       'cmd.Parameters(1) = Arg1 <--
 End If

不评论后的第一步成功了..。这是个好兆头。将继续测试并汇报。当我之前添加CreateParameter行时,我没有检查用户权限,所以这可能是问题所在。在这两者之间,它可能会得到解决。准备!

UPDATE:添加了下面的一行并得到了一个新的错误:-2147217911执行权限在对象-2147217904过程或函数'DW_LocalAccount_Read‘预期参数'@RowID’上被拒绝,该参数没有提供。

转到SP正在打开的服务器上,查看access DB使用的用户,它具有读/写访问权限,但我给它所有者进行了测试,然后错误更改为:-2147217904过程或函数'DW_LocalAccount_Read‘预期参数'@RowID',但没有提供。

因此,这缩小了一些,我必须弄清楚为什么参数没有被传递。

代码语言:javascript
复制
 If Not IsMissing(Arg1) Then
        cmd.CreateParameter(1, adVarChar, adParamInput) = Arg1 <--
       'cmd.Parameters(1) = Arg1
 End If

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++原始问题贴++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我花了一天半的时间阅读了数百篇关于“对象所需”和“在这个集合或序号中找不到的项目”错误的文章,但似乎没有什么能与我的问题完全一致。

我从不再在这里工作的人那里继承了一个Access 365 DB。有一个保存客户数据的表单,它是通过SQL Server中的存储过程传入的。前端访问用户要求在Ship1为空白时将Ship3中的数据输入到ship3中。在SP中,我添加了一个case语句来完成工作正常的事情。

然而,当我回到Access前端时,它现在正在抛出一个对象所需的错误:

代码语言:javascript
复制
Set rsLocal = FormHandling.GetFormRecordset("DW_LocalAccount_Read", RowID)

假设这个问题是SP中的一个错误,我验证了所有的列都是按相同的顺序,所有的名称都是正确的等等。所以结果集将和以前一样(除了ship3),所以在我处理修改后的版本时,我换回了SP的旧版本,现在也不起作用了。

因此,我在Access中进行了一步,找到了错误的起始位置,并且似乎是从这里来的:

代码语言:javascript
复制
    If Not IsMissing(Arg1) Then
        **cmd.Parameters(1) = Arg1** <--
    End If

当我到达这一行时,它会出错,返回到原来的Set语句,并抛出对象所需的错误。我提交了一个msgbox来查找错误,结果显示“在与请求的名称或序号相对应的集合中找不到3265项”。

整个职能是:

代码语言:javascript
复制
Public Function GetFormRecordset(CommandText As String, Optional Arg1 As Variant, Optional Arg2 As Variant, Optional Arg3 As Variant, Optional Arg4 As Variant, Optional Arg5 As Variant) As Variant
    
    On Error GoTo Function_Error
    Dim cmd As New ADODB.Command
    Dim rs As New ADODB.Recordset
    Dim parm As ADODB.Parameter
    Dim rsDBO As DAO.Recordset
    
    cmd.CommandType = adCmdStoredProc
    cmd.NamedParameters = True
    cmd.Prepared = True
    cmd.CommandText = CommandText
    
    Set cmd.ActiveConnection = DWDB
    cmd.Parameters.Refresh
                   
    If Not IsMissing(Arg1) Then
        cmd.Parameters(1) = Arg1
    End If
    
    If Not IsMissing(Arg2) Then
        cmd.Parameters(2) = Arg2
    End If
    
    If Not IsMissing(Arg3) Then
        cmd.Parameters(3) = Arg3
    End If
    
    If Not IsMissing(Arg4) Then
        cmd.Parameters(4) = Arg4
    End If
    
    If Not IsMissing(Arg5) Then
        cmd.Parameters(5) = Arg5
    End If
    
    Set rs = New ADODB.Recordset
    With rs
        .CursorLocation = adUseClient
        .CursorType = adOpenKeyset
        '.LockType = adLockOptimistic
        .LockType = adLockReadOnly
        .Open cmd
        .MoveLast
        .MoveFirst
    End With
    
    Set GetFormRecordset = rs
    
    
Function_Exit:
    On Error Resume Next
    'rs.Close
    'Set cmd = Nothing
    'rsDBO.Close
    'Set rsDBO = Nothing
    On Error GoTo 0
    Exit Function
    
Function_Error:
    If Err.Number = 3709 Then
        'no valid conn
        Set GetFormRecordset = Nothing
    ElseIf Err.Number = 3021 Then
        'EOF/BOF
        Resume Next
    End If

End Function

我对处理参数和集合有点陌生;所以我试着阅读,并尝试在"=arg1“部分之前附加参数,但这不起作用。我觉得我遗漏了一些东西,为什么原来的SP会起作用,但是当我只把数据从一列交换到另一列时,它就失效了吗?那么,为什么在没有更改访问代码的情况下,原来的SP工作过而现在却不工作呢?任何帮助都会很感激,因为我觉得我的头撞在这面墙上。

哦,这是原来的SP也是:

代码语言:javascript
复制
USE [DB]
GO

/****** Object:  StoredProcedure [dbo].[DW_LocalAccount_READ]    Script Date: 8/16/2022 11:31:39 AM ******/
DROP PROCEDURE [dbo].[DW_LocalAccount_READ]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
    
CREATE PROCEDURE [dbo].[DW_LocalAccount_READ]
    @RowID as Varchar(38)   
AS 
    SET NOCOUNT ON
BEGIN TRY

        BEGIN
            SELECT RBCCustDtl.*
            FROM RBCCustDtl WITH(NOLOCK)
            Where 
                (
                RBCCustDtl.RBCCustDtlCustDtlRowID = Cast(@Rowid as uniqueidentifier)
                Or 
                @RowID = ''
                )
        END
    END TRY

BEGIN CATCH     
    IF @@ERROR <> 0
        BEGIN
            Return null
        END
END CATCH
GO
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-19 20:20:02

该问题最终完全是服务器权限问题。Access DB用户有权对数据库进行读/写,但当我删除/创建该过程时,该用户失去了对SP的执行权限。一旦我批准了对SP的执行,一切都就位了,包括对SP的修改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73378903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档