更新2:我呃..。可能忘了取消评论这一行..。
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',但没有提供。
因此,这缩小了一些,我必须弄清楚为什么参数没有被传递。
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前端时,它现在正在抛出一个对象所需的错误:
Set rsLocal = FormHandling.GetFormRecordset("DW_LocalAccount_Read", RowID)假设这个问题是SP中的一个错误,我验证了所有的列都是按相同的顺序,所有的名称都是正确的等等。所以结果集将和以前一样(除了ship3),所以在我处理修改后的版本时,我换回了SP的旧版本,现在也不起作用了。
因此,我在Access中进行了一步,找到了错误的起始位置,并且似乎是从这里来的:
If Not IsMissing(Arg1) Then
**cmd.Parameters(1) = Arg1** <--
End If当我到达这一行时,它会出错,返回到原来的Set语句,并抛出对象所需的错误。我提交了一个msgbox来查找错误,结果显示“在与请求的名称或序号相对应的集合中找不到3265项”。
整个职能是:
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也是:
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发布于 2022-08-19 20:20:02
该问题最终完全是服务器权限问题。Access DB用户有权对数据库进行读/写,但当我删除/创建该过程时,该用户失去了对SP的执行权限。一旦我批准了对SP的执行,一切都就位了,包括对SP的修改。
https://stackoverflow.com/questions/73378903
复制相似问题