Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Вызов хранимой процедуры, проблемы получения резул


Автор: gambit 1.2.2010, 23:30
Задача: вызвать хранимую процедуру и получить значение.
Пишу код:
Код

static public int ReturnIdSUser(string name)
        {
            using (SqlConnection conStr = new SqlConnection(connectionString))
            {
                SqlCommand com = new SqlCommand();
                com.Connection = conStr;
                com.CommandText = "ReturnIdSUser";
                com.CommandType = CommandType.StoredProcedure;
                com.Parameters.AddWithValue("@name", name);
                conStr.Open();
                var reader = com.ExecuteReader();
                reader.Read();
                return int.Parse(reader[0].ToString());
            }
        }

Получаю ошибку - чтение невозможно по причине отсутствия данных.
Подскажите где накосячил?

Добавлено через 53 секунды
Процедура на 100% рабочая

Автор: Ceiceron 1.2.2010, 23:44
трудно сказать, визуально код как бы правильный.
если запрос возвращает только одну запись и одно число почему бы не воспользоваться методом com.ExecuteScalar()?

Автор: gambit 1.2.2010, 23:57
Цитата(Ceiceron @  1.2.2010,  23:44 Найти цитируемый пост)
почему бы не воспользоваться методом com.ExecuteScalar()?

спасибо, на будущее учту, но в данном случае это не помогло.
В  SQL Server Management, хранимка отрабатывает чудесно, в коде постоянно возвращается null  smile  smile  smile  smile  smile 

Автор: Ceiceron 2.2.2010, 00:10
ради теста можно попробовать вызвать процедуру не параметризированно:
Код

com.CommandText = "exec ReturnIdSUser "+name;
SqlDataReader reader = com.ExecuteReader();
...

Автор: gambit 2.2.2010, 00:16
Цитата(Ceiceron @  2.2.2010,  00:10 Найти цитируемый пост)
ради теста можно попробовать вызвать процедуру не параметризированно:

Цитата

Недопустимая попытка чтения при отсутствии данных.

Кто то из нас 2 двоих(студия и я) - тупой. Но боюсь что студия вряд ли.

Автор: Ceiceron 2.2.2010, 00:26
Студия - это железная болванка как к ней руки приложишь, такой выточка и получиться.

В сути, корень ошибки тут один. И мне кажется он где-то в промежутке между выполнением процедуры и чтением результата.
Прототип процедуры можно в студию? Желательно кусок скрипта по ее созданию.

Автор: gambit 2.2.2010, 00:41
Цитата(Ceiceron @  2.2.2010,  00:26 Найти цитируемый пост)
Прототип процедуры можно в студию? 

Процедура проста до безумия)))

Цитата(Ceiceron @  2.2.2010,  00:26 Найти цитируемый пост)
Желательно кусок скрипта по ее созданию. 

По изменению

Код

ALTER PROCEDURE [dbo].[ReturnIdStud] 
    @name nvarchar(20)
AS
BEGIN
DECLARE @idUser INT;
    SET @idUser = (SELECT id FROM Users WHERE [name]=@name)
    return (SELECT id FROM students WHERE [idUser]=@idUser)
END


меня больше всего поражает, что в SQL менеджере, процедура чудесно работает

Автор: Ceiceron 2.2.2010, 07:58
Начнем с того, что процедура, не функция и return делать явно не должна. гипотетический представите, что процедура однажды вернет более чем одно значение. SQL Server пошлет вас подальше при таком обращении. Если хочется использовать именно функцию, то ее и надо писать (только вызываться она будет селектом). Собственно простой эксперимент позволил установить, что из-за return в хранимке все проблемы.

Автор: mrbrooks 2.2.2010, 09:17
gambit, попробуй задать своему параметру свойство Direction = ParameterDirection.Output:

Автор: Ceiceron 2.2.2010, 09:45
Цитата(mrbrooks @ 2.2.2010,  09:17)
gambit, попробуй задать своему параметру свойство Direction = ParameterDirection.Output:

это не совсем верно. Output относиться к out параметам процедуры. тут уж лучше использовать
Код

param.Direction = ParameterDirection.ReturnValue;

http://msdn.microsoft.com/en-us/library/59x02y99(VS.71).aspx

Автор: mrbrooks 2.2.2010, 10:05
Цитата(Ceiceron @  2.2.2010,  09:45 Найти цитируемый пост)
это не совсем верно. Output относиться к out параметам процедуры.

Точняг! Недобдел.

Автор: gambit 2.2.2010, 20:46
Задачу решил.

Если кому интересно:
Вариант 1 - 
тупо убрать слово return из процедуры, и все заработало.

Вариант 2 -
изврат с параметрами
Код

using (SqlConnection conStr = new SqlConnection(str))
            {
                SqlCommand com = new SqlCommand();
                com.Connection = conStr;
                com.CommandText = "ReturnIdSUser";
                com.CommandType = CommandType.StoredProcedure;
                com.Parameters.AddWithValue("@name", name);
                var res = new SqlParameter();
                res.Direction = ParameterDirection.Output;
                res.ParameterName = "@idUser";
                res.SqlDbType = SqlDbType.Int;
                res.Size = 4;
                com.Parameters.Add(res);
                conStr.Open();
                com.ExecuteScalar();
                return int.Parse(res.Value.ToString());
           }


Оба варианта решают проблему

Автор: Ceiceron 2.2.2010, 23:54
Первый вариант самый цивильный, второй от лукавого (если конечно подобного не требует задача).

Автор: mrbrooks 3.2.2010, 08:34
Ceiceron, все таки Output!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)