2016-05-06 182 views
1

我在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) 

updateRecord func在类classModule 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

为什么你想从MSACCESS前端到SQL服务器进行通信bac kend.instead将所有数据导入msaccess.Do就像这样。首先创建非常简单的proc而不使用表类型并查看它是否工作。 – KumarHarsh

+0

@KumarHarsh感谢您的回复,但我试图保留几乎所有需要大脑的服务器级别,并将Access前端用作单纯的数据持有者。再一次感谢你。 – Shallo

回答

3

据我所知你不能传递一个表类型使用ADODB。我认为至少最坏的选择是创建一个包装过程,从访问,在那里你传递整数作为一个逗号分隔的列表拨打:

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版本而异。在分割字符串的问题的一些良好的阅读可以在这里找到:

+0

非常感谢您的协助。 – Shallo

相关问题