2012-01-04 3 views
0

Недавно я недавно сменил несколько функций при отладке запроса cte (получили помощь здесь). Я только что сменил несколько функций. У меня появился мой запрос на работу. Но теперь, когда мой код клиента C# вызывает эти функции через хранимые procs для моей логики программы, я получаю сообщение об ошибке «Процедура или функция DateTimeOfNextAvailableDataRun» ожидает параметра '@ NextDateTime ', который не был отправлен. «Возможно, возвращаются несколько значений?SQL-сервер хранит proc «Процедура или функция ожидает параметр, который не был указан».

Вот функция в ее нынешнем виде:

ALTER FUNCTION dbo.NextAvailableDataDownloadDateTime() 
    RETURNS date 
BEGIN 
    RETURN (SELECT DATEADD(hour, 18, MIN(TradingDate)) AS TrDate 
    FROM tblTradingDays 
    WHERE (DATEADD(hour, 18, TradingDate) > dbo.LatestDataDownloadDate())) 
END 

И ХП, который вызывает его:

ALTER PROC DateTimeOfNextAvailableDataRun 
    @NextDateTime DateTime2 OUTPUT 
AS 
    SELECT @NextDateTime = dbo.NextAvailableDataDownloadDateTime() 

И, наконец, мой код клиента, который сделал работать до изменения:

public DateTime DateTimeOfNxtAvailableDataRun() 
      { 
       DateTime dateTimeOfNxtAvailableDataRun; 

       using (SqlCommand cmd = new SqlCommand("DateTimeOfNextAvailableDataRun", this.sqlConnection)) 
       { 
        cmd.CommandType = System.Data.CommandType.StoredProcedure; 
        cmd.ExecuteNonQuery(); 
        dateTimeOfNxtAvailableDataRun = (DateTime)cmd.ExecuteScalar(); 
       } 

       return dateTimeOfNxtAvailableDataRun; 
      } 

Любые берущие? Опять же, функции работают в моем запросе sql-сервера (см. Недавние сообщения от меня), но теперь код вызова не согласен.

ответ

2

Вы должны изменить тело оператора using и добавить выходной параметр перед выполнением команды.

var outputParameter = new SqlParameter { 
    ParameterName = "@NextDateTime", 
    Direction = ParameterDirection.Output 
}; 
cmd.Parameters.Add(outputParameters); 
cmd.ExecuteNonQuery(); 
return (DateTime)outputParameter.Value; 
+0

Я думал, что это очевидно, но я бежал без него. Я уверен. Может быть, не в мои часы ночной проб и ошибок ... thx. – StatsViaCsh

+0

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

+0

Вы не можете «вернуть» нецелое значение из хранимой процедуры. Вы можете, однако, просто «ВЫБРАТЬ» значение в хранимой процедуре, например «SELECT dbo.NextAvailableDataDownloadDateTime()», и просто используйте 'cmd.ExecuteScalar()' вместо 'ExecuteNonQuery()' и верните результат в 'DateTime' –

Смежные вопросы