我在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
答案 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版本而异。关于分裂字符串的一些好的阅读可以在这里找到: