我在 SQL Server 中有一个存储过程,它接受数据表和 NewOwnerID 作为参数,并更新 ID 与数据表中的 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 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 版本。可以在这里找到一些关于分割字符串主题的好读物:
关于c# - 如何将用户定义类型的数组传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071552/