Получение значения хранимой процедуры C # - PullRequest
4 голосов
/ 08 февраля 2012

Я пробовал разные способы, но не повезло.Используя Microsoft Visual Studio и SQL Server 2005, вот код c # и код sql

List<SqlParameter>  _params3 = new List<SqlParameter>();
_params3.Add(new SqlParameter("@startdate", txtDateFrom.Text));
_params3.Add(new SqlParameter("@enddate", txtDateTo.Text));
_params3.Add(new SqlParameter("@days", extendedDays));

extendedDays = Convert.ToInt32(DAL.executeStoredProcedureScalar(
                   "Time_Difference_Calc", _params3));

Код SQL:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[Time_Difference_Calc]
    -- Add the parameters for the stored procedure here
    @startdate datetime,
    @enddate datetime,
    @days int output
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    set @days = (Select RawDays
    - NumWeeks * 2
    + CASE WHEN StartWD = 1 THEN 1 ELSE 0 END
    - CASE WHEN EndWD = 7 THEN 1 ELSE 0 END
    + 1
    AS Result
    FROM
    (SELECT Datepart(dw,@startdate) as StartWD,
    Datepart(dw,@enddate) as EndWD,
    DateDiff(d,@startdate,@enddate) as RawDays,
    DateDiff(wk,@startdate,@enddate) as NumWeeks
    ) A)

    --SET @ReturnValue = @days
    RETURN @days
END

Я могу запустить его в базе данных просто отлично .. вывод 2даты в .. отлично работает для того, что мне нужно ..

Но всякий раз, когда я запускаю его на странице, всегда получаю

System.NullReferenceException: ссылка на объект не установлена ​​наэкземпляр объекта. "
ошибка источника: return cmd.ExecuteScalar (). ToString ();

Любая помощь приветствуется. Практически идея заключается в том, что я просто хочу получить расширенные дни равнымик тому, что возвращает хранимая процедура.

Ответы [ 5 ]

4 голосов
/ 08 февраля 2012

Вам необходимо установить свойство Direction для параметра @ day равным ParameterDirection.Output

Кроме того, вам придется вывести значение@day SqlParamater. Value свойство

3 голосов
/ 08 февраля 2012

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

Если в вашей хранимой процедуре есть раздел в соответствии с SELECT TOP 1 foo FROM bar WHERE baz = @quux;, тогда ExecuteScalar (или ваш эквивалент этого) будет оценен. Однако вы возвращаете значение в качестве выходного параметра, поэтому это не запрос.

Примечание: другие ответы верны о необходимости установки направления параметра, но именно поэтому вы получаете исключение NullReferenceException.

1 голос
/ 08 февраля 2012

Измените свою хранимую процедуру, чтобы выбрать значение вместо использования параметра. Тогда вы можете продолжать использовать ExecuteScalar.

Сохраненный процесс будет выглядеть примерно так:

ALTER PROCEDURE [dbo].[Time_Difference_Calc]
    -- Add the parameters for the stored procedure here
    @startdate datetime,
    @enddate datetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    Select RawDays
    - NumWeeks * 2
    + CASE WHEN StartWD = 1 THEN 1 ELSE 0 END
    - CASE WHEN EndWD = 7 THEN 1 ELSE 0 END
    + 1
    AS Result
    FROM
    (SELECT Datepart(dw,@startdate) as StartWD,
    Datepart(dw,@enddate) as EndWD,
    DateDiff(d,@startdate,@enddate) as RawDays,
    DateDiff(wk,@startdate,@enddate) as NumWeeks
    ) A
END

Еще одна вещь, которую следует учитывать, если вы вызываете это только из приложения, то сохраненный процесс является бесполезным. Вам не нужен SQL Server для этого вычисления, и это проще сделать в коде.

1 голос
/ 08 февраля 2012
_params3.Direction = System.Data.ParameterDirection.Output;

exec proc

extendedDays = Convert.ToInt32(_params3.Value);
0 голосов
/ 08 февраля 2012
SqlParameter daysParameter = new SqlParameter("@days", extendedDays);
    daysParameter .Direction = ParameterDirection.Output;
    _params3.Parameters.Add(daysParameter );

должен сделать трюк

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