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

时间:2016-05-06 11:45:34

标签: c# sql-server ms-access-2010

我在SQL Server中有这个存储过程,它接受一个数据表和一个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函数 我在以下代码的第四行收到错误

Dim IDList() As MyIDs
Dim objUL As clsUpdateLeads
Set objUL = New clsUpdateLeads
Call objUL.updateRecord(IDList, Me.updateEmployeeID)

classModule中updateRecord函数的定义clsUpdateLeads

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

1 个答案:

答案 0 :(得分:3)

据我所知,你不能使用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版本而异。关于分裂字符串的一些好的阅读可以在这里找到:

相关问题