Comment transmettre un tableau de type défini par l'user à une procédure stockée

J'ai cette procédure stockée dans SQL Server qui accepte un datatable et un NewOwnerID comme parameters et met à jour toutes les lignes dont l'ID correspond à celui dans Datatable.

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 

J'ai utilisé ceci de C # qui est calme simple. Maintenant le pire, j'ai besoin d'appeler cette procédure stockée à partir d'un front-end MS Access. Comment puis-je faire cela?

J'ai essayé le ci-dessous dans MSACCESS, mais get une erreur

Créé un type défini par l'user dans un module

 Public Type MyIDs ID As Long End Type 

Dans un formulaire que j'appelle la fonction updateRecord de la class clsUpdateLeads j'obtiens l'erreur à la quasortingème ligne du code ci-dessous

 Dim IDList() As MyIDs Dim objUL As clsUpdateLeads Set objUL = New clsUpdateLeads Call objUL.updateRecord(IDList, Me.updateEmployeeID) 

Définition de la fonction updateRecord dans 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 

Autant que je sache, vous ne pouvez pas passer un type de table en utilisant ADODB. Je pense que l'option la less pire est de créer une procédure wrapper pour appeler à partir d'Access, où vous passez les entiers sous la forme d'une list délimitée par des virgules:

 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 yivalue('.', '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 

Une très grande mise en garde ici, et donc la validation est que l'utilisation de XML pour séparer les strings ne fonctionnera que si vous pouvez garantir qu'aucun caractère XML spécial ne sera contenu dans la string.

La méthode exacte que vous utilisez pour split votre paramètre de string peut varier selon les exigences et votre version de SQL Server. Quelques bonnes lectures sur le sujet des strings de séparation peuvent être trouvées ici:

  • Séparer les cordes dans le bon sens – ou la meilleure façon suivante
  • Fractionnement des strings: maintenant avec less de T-SQL
  • Fractionnement des strings: un suivi
  • Sursockets et hypothèses de performance: STRING_SPLIT ()