ExecuteScalar всегда возвращает null при вызове функции со скалярным значением.

Почему это возвращает ноль?

//seedDate is set to DateTime.Now; con is initialized and open. Not a problem with that
using (SqlCommand command = new SqlCommand("fn_last_business_date", con))
{
       command.CommandType = CommandType.StoredProcedure;
       command.Parameters.AddWithValue("@seed_date", seedDate);//@seed_date is the param name
       object res = command.ExecuteScalar(); //res is always null 
}

Но когда я вызываю это непосредственно в БД следующим образом:

select dbo.fn_last_business_date('8/3/2011 3:01:21 PM') 
returns '2011-08-03 15:01:21.000' 

это результат, который я ожидаю увидеть, когда вызываю его из кода

Почему, почему, почему?


person Icarus    schedule 03.08.2011    source источник


Ответы (3)


пытаться:

using (SqlCommand command = new SqlCommand("select dbo.fn_last_business_date(@seed_date)", con))
{
       command.CommandType = CommandType.Text;
       command.Parameters.AddWithValue("@seed_date", seedDate);//@seed_date is the param name
       object res = command.ExecuteScalar(); //res is always null 
}
person jenson-button-event    schedule 03.08.2011
comment
У меня нет проблем с возвратом значения из функции sql. Он делает то, что должен. Моя проблема в коде С#. Я не понимаю, почему результат всегда нулевой, если я передаю действительный @seed_date; Если это поможет, я могу вставить код sql_function. Единственное, что особенного в моей sql_function, это то, что она использует рекурсию... может это проблема? Это было бы странно. - person Icarus; 03.08.2011
comment
действительно ли fn_last_business_date является хранимой процедурой? если нет, убедитесь, что вы добавили выбор и сделали тип команды Text (см. мои правки) - person jenson-button-event; 03.08.2011
comment
хе-хе-хе, я только что ответил gbn, что думал об этом, но подумал, что это не элегантно ;) Я попробую, и если это сработает, я отдам вам должное. Спасибо. - person Icarus; 03.08.2011
comment
Кредит на что? Читать ссылки в моем ответе, а затем менять необработанный SQL на какой-то .net? См. отредактированную: xx mins ago ссылку... - person gbn; 03.08.2011
comment
Хорошо, в итоге я сделал это: SqlCommand command = new SqlCommand(select dbo.fn_last_business_date('+seedDate.ToShortDateString()+'), con), и это сработало. Мне придется уйти с этим. Проголосовал за ваше предложение. Спасибо! - person Icarus; 03.08.2011
comment
@gbn не обольщайтесь. я не видел ссылок. - person jenson-button-event; 03.08.2011

Почему все настаивают на синтаксисе select?..

using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("calendar.CropTime", c))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@RETURN_VALUE", SqlDbType.DateTime).Direction = ParameterDirection.ReturnValue;
    cmd.Parameters.AddWithValue("@d", DateTime.Now);

    cmd.ExecuteNonQuery();

    textBox1.Text = cmd.Parameters["@RETURN_VALUE"].Value.ToString();

}
person GSerg    schedule 03.08.2011
comment
Интересно, отрицательный голос, который не оставил комментарий, на самом деле доказал, что вышеизложенное неверно, или просто подумал: «Эй, я обычно делаю это не так». - person GSerg; 04.08.2011
comment
Вероятно, первый, я согласен с вашим ответом: D, это функция, она должна работать, я думаю, он сделал отрицательный голос, потому что это не связано с сообщением, для текстового поля и календаря. CropTime и параметр даты xD, может за это (+1) - person Hector Sanchez; 04.08.2011
comment
Так же, как комментарий, если я хорошо помню, просто чтобы было ясно, когда вы используете функцию, возвращаемое значение должно быть первым параметром набора параметров, если функция ожидает больше параметров. - person Hector Sanchez; 04.08.2011
comment
+1 - эта техника работает. Но обратите внимание на следующее предостережение: обработка UDF как хранимой процедуры таким образом будет работать только в том случае, если UDF является UDF со скалярным значением. Если UDF имеет табличное значение (либо встроенное, либо состоящее из нескольких операторов), вы получите сообщение об ошибке, например: Запрос процедуры «Name_Of_UDF» завершился неудачно, поскольку «Name_Of_UDF» является объектом функции с табличным значением. - person Moe Sisko; 04.08.2011
comment
@Moe О да. Вызов скалярного UDF является самой сутью вопроса ОП. - person GSerg; 04.08.2011

На самом деле вы получаете ошибку, которая не отлавливается. Вы не вызываете скалярные udf, как хранимые процедуры.

Либо оберните udf в хранимую процедуру, либо измените синтаксис. Я на самом деле не уверен, что это такое, потому что это не обычно...

Ах ха: см. эти вопросы:

person gbn    schedule 03.08.2011
comment
Спасибо, а у вас есть пример вызова функций? Я подумал о создании такой инструкции: new SqlCommand(выберите dbo.fn_last_business_date(+seedDate.ToString()+), а затем выполните command.CommandType=CommandType.Text, но это не выглядело элегантно: P - person Icarus; 03.08.2011
comment
@gbn: спасибо за ссылки. Они оба были полезны. Я понятия не имел, что это правильный способ вызова sql-функций в .NET. Ваш ответ также проголосовал. - person Icarus; 03.08.2011