C# 如何将用户定义类型的数组传递给存储过程

C# 如何将用户定义类型的数组传递给存储过程,c#,sql-server,ms-access-2010,C#,Sql Server,Ms Access 2010,我在SQL Server中有一个存储过程,它接受一个datatable和一个NewOwnerID作为参数,并更新ID与datatable中的ID匹配的所有行 CREATE Procedure [dbo].[udpUpdateActivityLead] @ActivityLeadTable ActivityLeadType READONLY, @OwnerTo int AS BEGIN UPDATE [tblActivity] set [tblActivity].[emp

我在SQL Server中有一个存储过程,它接受一个datatable和一个NewOwnerID作为参数,并更新ID与datatable中的ID匹配的所有行

CREATE Procedure [dbo].[udpUpdateActivityLead]
@ActivityLeadTable  ActivityLeadType READONLY,
@OwnerTo            int
AS
BEGIN
UPDATE [tblActivity] 
set [tblActivity].[employeeID] = @OwnerTo
from @ActivityLeadTable
where [tblActivity].[activityID] in (Select ID from [@ActivityLeadTable])
END
我用的是C语言,非常简单。现在最糟糕的是,我需要从MS Access前端调用这个存储过程。我该怎么做

我在MSACCESS中尝试了以下操作,但出现错误

在模块中创建了用户定义的类型

Public Type MyIDs
ID As Long
End Type
在一个表单中,我从类clsUpdateLeads调用updateRecord函数 我在下面代码的第四行得到错误

classModule clsUpdateLeads中updateRecord函数的定义

Public Sub updateRecord(activityIDs() As MyIDs, NewOwnerID As Long)
If Not (isConnectionOpen()) Then
OpenConnection
End If

Set ADOCom = New ADODB.Command
ADOCom.ActiveConnection = ADOConn
ADOCom.CommandType = adCmdStoredProc
ADOCom.CommandText = "[dbo].[udpUpdateActivityLead]"

ADOCom.Parameters.Append ADOCom.CreateParameter("@ActivityLeadTable", adArray, adParamInput, 10, activityIDs())
ADOCom.Parameters.Append ADOCom.CreateParameter("@OwnerTo", adBigInt, adParamInput, 10, NewOwnerID)
ADOCom.Execute

End Sub

据我所知,使用ADODB无法传递表类型。我认为最糟糕的选择是创建一个包装过程来从Access调用,其中整数作为逗号分隔的列表传递:

CREATE PROCEDURE dbo.udpUpdateActivityLead_MSAccess @ActivityLeadList VARCHAR(4000), @OwnerToInt INT
AS
BEGIN
    -- VALIDATE THAT STRING ONLY CONTAINS NUMBERS AND COMMAS
    IF PATINDEX('%[^0-9,]%', @ActivityLeadList) > 0
    BEGIN
        RAISERROR('Invalid Activity Leads (non integer values found)', 16, 1);
        RETURN;
    END

    -- CONVERT LIST TO TABLE
    DECLARE @ActivityLeadTable dbo.ActivityLeadType;
    INSERT @ActivityLeadTable (ID)  
    SELECT y.i.value('.', 'int')
    FROM (SELECT CAST('<i>' + REPLACE(@ActivityLeadList, ',', '</i><i>') + '</i>' AS XML)) x(i)
        CROSS APPLY i.nodes('i') y (i);

    EXECUTE dbo.udpUpdateActivityLead @ActivityLeadTable, @OwnerToInt;
END
这里有一个非常重要的警告,因此验证是,只有在能够保证字符串中不包含特殊的XML字符的情况下,使用XML分割字符串才有效

用于拆分字符串参数的确切方法可能因要求和SQL Server版本而异。在这里可以找到一些关于拆分字符串的好读物:


为什么要从msaccess前端到sql server bac kend进行通信。请将所有数据导入msaccess。请执行以下操作。或者先创建一个没有表类型的非常简单的过程,看看它是否有效。@KumarHarsh感谢您的回复,但我正在尝试将几乎所有需要大脑的内容保留在服务器级别并使用访问权限前端仅仅是一个数据持有者。再次感谢你,非常感谢你的帮助。
CREATE PROCEDURE dbo.udpUpdateActivityLead_MSAccess @ActivityLeadList VARCHAR(4000), @OwnerToInt INT
AS
BEGIN
    -- VALIDATE THAT STRING ONLY CONTAINS NUMBERS AND COMMAS
    IF PATINDEX('%[^0-9,]%', @ActivityLeadList) > 0
    BEGIN
        RAISERROR('Invalid Activity Leads (non integer values found)', 16, 1);
        RETURN;
    END

    -- CONVERT LIST TO TABLE
    DECLARE @ActivityLeadTable dbo.ActivityLeadType;
    INSERT @ActivityLeadTable (ID)  
    SELECT y.i.value('.', 'int')
    FROM (SELECT CAST('<i>' + REPLACE(@ActivityLeadList, ',', '</i><i>') + '</i>' AS XML)) x(i)
        CROSS APPLY i.nodes('i') y (i);

    EXECUTE dbo.udpUpdateActivityLead @ActivityLeadTable, @OwnerToInt;
END