2016-05-06 145 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

相關問題