Я не могу получить выходной параметр при использовании функции импорта Entity Framework - PullRequest
13 голосов
/ 04 мая 2011

Вот моя хранимая процедура SQL Server:

ALTER PROCEDURE [dbo].[SearchUser]
  (@Text NVARCHAR(100),  
   @TotalRows INT = 0 OUTPUT)   
AS
BEGIN 
   SELECT @TotalRows=1000
   SELECT * from Users
END

И мой код C #

using (var context = new TestDBEntities())
{
    var outputParameter = new ObjectParameter("TotalRows", typeof(Int32));
    context.SearchUser("", outputParameter);
    Response.Write(outputParameter.Value);
}

Однако outputParameter.Value всегда равно нулю.

Может кто-нибудь сказать мне, почему?

Ответы [ 3 ]

44 голосов
/ 25 августа 2011

Выходные параметры заполняются ее фактическими значениями во время выполнения хранимой процедуры.

Но хранимая процедура с табличными значениями фактически выполняется только в тот момент, когда вы пытаетесь перебрать результирующий набор записей, но не вызываетеМетод обертки.

Итак, это НЕ работает:

using (var context = new TestDBEntities()) 
{ 
    var outputParameter = new ObjectParameter("TotalRows", typeof(Int32)); 
    context.SearchUser("", outputParameter); 

    // Paremeter value is null, because the stored procedure haven't been executed
    Response.Write(outputParameter.Value); 

} 

Это действительно:

using (var context = new TestDBEntities()) 
{ 
    var outputParameter = new ObjectParameter("TotalRows", typeof(Int32)); 

    // Procedure does not executes here, we just receive a reference to the output parameter
    var results = context.SearchUser("", outputParameter);

    // Forcing procedure execution
    results.ToList();

    // Parameter has it's actual value
    Response.Write(outputParameter.Value); 

} 

Когда вы работаете с хранимыми процедурами, которые не возвращают какой-либо набор записей, они выполняются сразу после вызова метода, поэтому у вас есть фактическое значение в выходном параметре.

1 голос
/ 19 мая 2015

У нас возникла проблема симуляции из-за исключенного исключения, наши модульные тесты не прошли. Короче говоря, если у вас есть сохраненный процесс, который НЕ возвращает ничего, вам нужно обязательно установить тип ответа как 'Нет' , когда он установлен как 'Нет', он будет освобожден при вызове и не будет обработан.

В случае, если вы возвращаете что-либо (например, скалярный тип результатов String), будет использовать его при использовании результата, даже если этот метод .Count () или .ToList () находится вне метода, содержащего вызов функции .

Поэтому старайтесь не форсировать исключение, если в этом нет необходимости, при необходимости оно должно выполняться, но обязательно объявлять его правильно, иначе оно может не сработать.

0 голосов
/ 05 мая 2011

У меня такая же проблема раньше.Основная причина, по моему мнению, состоит в том, что структура сущностей имеет ошибку в том случае, если пользовательская хранимая процедура имеет выходной параметр и возвращает набор результатов.Например:

ALTER PROCEDURE [dbo].[SearchTest]
(   
    @RowTotal   INT = 0 OUTPUT,
    @RowCount   INT = 0 OUTPUT
)
AS
BEGIN   
    SET NOCOUNT ON
    SELECT * FROM SomeThing 
    SELECT @RowTotal = 1233, @RowCount = 5343
END

Однако, если вы измените пользовательскую хранимую процедуру следующим образом, вы можете получить выходные параметры

ALTER PROCEDURE [dbo].[SearchTest]
(   
    @RowTotal   INT = 0 OUTPUT,
    @RowCount   INT = 0 OUTPUT
)
AS
BEGIN   
    SET NOCOUNT ON  
    SELECT @RowTotal = 1233, @RowCount = 5343
END

Обойти это можно следующим образом:

ALTER PROCEDURE [dbo].[SearchTest]
AS
BEGIN   
    DECLARE @RowTotal INT, @RowCount INT

    SET NOCOUNT ON  
    SELECT @RowTotal = 1233, @RowCount = 5343

    SELECT @RowTotal  AS RowTotal, @RowCount AS RowCount, s.*
    FROM SomeThing s

END

Если у кого-нибудь есть лучшее решение, пожалуйста, скажите мне

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...