Linq To Sql: вызов хранимой процедуры с разными возвращаемыми значениями - PullRequest
1 голос
/ 20 сентября 2011

У меня есть хранимая процедура, которая в зависимости от входных данных возвращает несколько строк целых или несколько строк DateTimes.

Я посмотрел ответы на этот вопрос и прочитал и реализовал решение Скотта Гатриса из Обработка множественных форм результатов из SPROC (прокрутите страницу вниз, чтобы увидеть этот раздел.)

К сожалению, он просто не работает.

Вот мой код:

    [Function(Name = "FunkyStoredProcedure")]
    [ResultType(typeof(List<int>))]
    [ResultType(typeof(List<DateTime>))]
    public IMultipleResults FunkyStoredProcedure(int appId, int sId, int cId)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, (MethodInfo)(MethodInfo.GetCurrentMethod()), appId, sId, cId);
        return (IMultipleResults)result.ReturnValue;

    }
}

Используя SQL Server Profiler, Linq 2 Sql создает код, который выглядит следующим образом:

declare @p6 int
set @p6=0
exec sp_executesql N'EXEC @RETURN_VALUE = [FunkyStoredProcedure] @appId = @p0, @sId = @p1, @cId = @p2',N'@p0 int,@p1 int,@p2 int,@RETURN_VALUE int output',@p0=2,@p1=4,@p2=2,@RETURN_VALUE=@p6 output
select @p6

, который создает результирующий набор, который выглядит следующим образом:

cId
-----------
694
42
43
41
4732


-----------
0

(1 row(s) affected)

Обратите внимание, что здесь есть два набора результатов (должен быть только один.) И обратите внимание, что второй набор результатов, тот, который возвращается в LinqToSql, равен 0!

Строка "exec sp_executesql ..." создает первый правильный набор результатов.

Строка «select @ p6» выдает второй, неправильный набор результатов.

Прежде всего, почему @ p6 определяется как int? В этой функции у меня есть два возможных ResultTypes: List и List. Это кажется проблемой прямо здесь.

Во-вторых, почему он не возвращает вывод хранимой процедуры? И вместо того, чтобы вернуть значение @ p6?

Наконец, самое главное, как мне заставить это работать правильно?

1 Ответ

1 голос
/ 21 сентября 2011

Игнорировать профилировщик - он ведет вас по неверному пути; -)

Как вы читаете результаты?Вы должны прочитать их в IMultipleResults, а затем вызвать GetResult <>, чтобы получить фактические данные, т. Е.

IMultipleResults result = dc.FunkyStoredProcedure(1,2,3);
var ints = result.GetResult<int>();

или

IMultipleResults result = dc.FunkyStoredProcedure(1,2,3);
var dts = result.GetResult<DateTime>();

Если вы выбрали неправильный тип и перечислите черезВ результате вы получите исключение SystemException (message = "Указанное приведение недопустимо."), поэтому, если вы не знаете тип, предположите тот, который наиболее вероятен, а если выбрасывает вышеприведенное, попробуйте другой тип вместо.

Что-то вроде:

IMultipleResults result = dc.FunkyStoredProcedure(1,2,3);
try
{
    var ints = result.GetResult<int>();
    DoStuffWithIntegerResults(ints);
}
catch(SystemException)
{
    var dates = result.GetResult<DateTime>();
    DoStuffWithDateResults(dates);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...