La procédure stockée attend le paramètre: le paramètre est indiqué dans Profiler…?
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)
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);
Où 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).