如何将用户定义类型的数组传递给存储过程
How to pass array of user defined type to a stored procedure
我在 SQL 服务器中有这个存储过程,它接受一个数据表和一个 NewOwnerID 作为参数,并更新 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
在表单中,我从 class clsUpdateLeads 调用 updateRecord 函数
我在下面代码的第四行出错
Dim IDList() As MyIDs
Dim objUL As clsUpdateLeads
Set objUL = New clsUpdateLeads
Call objUL.updateRecord(IDList, Me.updateEmployeeID)
class模块 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 传递 table 类型。我认为最不糟糕的选择是创建一个包装程序以从 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 服务器版本而异。可以在这里找到一些关于拆分字符串主题的好读物:
我在 SQL 服务器中有这个存储过程,它接受一个数据表和一个 NewOwnerID 作为参数,并更新 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
在表单中,我从 class clsUpdateLeads 调用 updateRecord 函数 我在下面代码的第四行出错
Dim IDList() As MyIDs
Dim objUL As clsUpdateLeads
Set objUL = New clsUpdateLeads
Call objUL.updateRecord(IDList, Me.updateEmployeeID)
class模块 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 传递 table 类型。我认为最不糟糕的选择是创建一个包装程序以从 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 服务器版本而异。可以在这里找到一些关于拆分字符串主题的好读物: