ExecuteScalar всегда возвращает ноль при вызове скалярной функции - PullRequest
4 голосов
/ 03 августа 2011

Почему это возвращает 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' 

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

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

Ответы [ 3 ]

23 голосов
/ 03 августа 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();

}
7 голосов
/ 03 августа 2011

попробуй:

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 
}
1 голос
/ 03 августа 2011

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

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

Ах, ха: посмотрите на эти вопросы:

...