La procédure stockée attend le paramètre: le paramètre est indiqué dans Profiler…?

StackOverflow https://stackoverflow.com/questions/9520883

  •  15-11-2019
  •  | 
  •  

Question

J'appelle une procédure stockée à partir d'un DbContext utilisant SqlQuery(). Quand j'exécute la requête, j'obtiens l'erreur Procedure or function 'p_Insert_Phones' expects parameter '@Number', which was not supplied. Qu'est-ce que j'oublie ici? Je vois le @Number paramètre.

declare @p5 nvarchar(255)

set @p5=NULL

exec sp_executesql N'p_Insert_Phones',
     N'@Number int,
     @PhoneTypeId int,
     @ReturnId nvarchar(255) output',
     @Number=0,
     @PhoneTypeId=0,
     @ReturnId=@p5 output

select @p5

ÉDITER

Définition de procédure

CREATE PROCEDURE [dbo].[p_Insert_Phones]
(
    @Number int,
    @PhoneTypeId int,
    @ReturnId uniqueidentifier out
) 
AS 
DECLARE @id TABLE(
    ReturnColId uniqueidentifier
) 

BEGIN TRAN 
    INSERT INTO Phones ([Number],[PhoneTypeId]) 

    OUTPUT inserted.Id 
    INTO @id 
    VALUES (@Number,@PhoneTypeId) 
COMMIT TRAN 

SET @ReturnId = (SELECT ReturnColId FROM @id)
Était-ce utile?

La solution 2

Vous ne pouvez pas appeler une procédure stockée que l'on trouve dans la base de données. Les paramètres que vous fournissez ne seront pas trouvés par la procédure stockée. J'ai résolu le problème en incluant la procédure stockée en tant que SQL dans l'appel DBContext.

var sqlInsert = "DECLARE @id TABLE(ReturnColId uniqueidentifier) " + 
"BEGIN TRAN INSERT INTO Phones " +
    "([Number],PhoneTypeId]) " +
    "OUTPUT inserted.Id " +
    "INTO @id " +
    "VALUES (@Number,@PhoneTypeId) " +
"COMMIT TRAN " +

"SET @ReturnId = (SELECT ReturnColId FROM @id)"

var sqlTransaction = context.Database.SqlQuery(type, insertProcedure, parameters.ToArray());

foreach (var record in sqlTransaction) { } // executes the lazy loading in order to
                                           // populate the out parameter.

Guid newId = new Guid(parameters[parameters.Count - 1].Value.ToString());

Autres conseils

S'il vous plaît essayez ce qui suit :

this.context.Database.SqlQuery<string>("p_Insert_Phones @Number = {0}, @PhoneTypeId = {1}", 0, 0);

this.context est le contexte que vous souhaitez utiliser du cours. Le paramètre de type générique pour le SqlQuery La méthode est le type de retour du résultat de la requête, dans votre cas est un nvarchar qui se traduit par un type de chaîne.

(Non testé, mais c'est une maquette basée sur le code que j'ai utilisé quelque part dans l'un de mes projets).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top