Хранимая процедура ожидает параметр: параметр отображается в профилировщике ...? - PullRequest
3 голосов
/ 01 марта 2012

Я вызываю хранимую процедуру из DbContext, используя SqlQuery(). Когда я запускаю запрос, я получаю сообщение об ошибке Procedure or function 'p_Insert_Phones' expects parameter '@Number', which was not supplied. Что мне здесь не хватает? Я вижу параметр @Number.

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

EDIT

Определение процедуры

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)

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Вы не можете вызвать хранимую процедуру, которая найдена в базе данных. Предоставленные вами параметры не будут найдены хранимой процедурой. Я решил проблему, включив хранимую процедуру в качестве sql в вызов 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());
0 голосов
/ 01 марта 2012

Пожалуйста, попробуйте следующее:

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

Где this.context - контекст, который вы хотите использовать, конечно.Параметр универсального типа для метода SqlQuery является типом возврата результата запроса, в вашем случае это nvarchar, который приводит к строковому типу.

(Не проверено, но это макет, основанный на коде, который я использовалгде-то в одном из моих проектов).

...