c# - 如何将用户定义类型的数组传递给存储过程

标签 c# sql-server ms-access-2010

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

相关文章:

c# - 如何加速此 C# 函数/SQL 插入?

mysql - 为什么在Access中的外部数据下选择 "Link to the data source by creating a linked table"选项没有任何显示?

ms-access - 无法使用 vba 打开 Word 文件进行编辑

c# - 如果 const int 没有唯一值,让编译器抛出错误

c# - C#.NET 中的 Pandas Dataframe 或类似工具

c# - 提取带有关键词的句子

windows - Access 2010 on shared server 编译麻烦

web.config 中的 C# Formsauthentication 超时是否会否决手动票证超时?

java - 如何修复连接字符串包含格式错误的名称或值

php 登录不显示 true 或 false