Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов хранимой процедуры, проблемы получения резул, Подскажите где я накосячил 
:(
    Опции темы
gambit
Дата 1.2.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



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

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% рабочая
PM MAIL ICQ Skype   Вверх
Ceiceron
Дата 1.2.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
gambit
Дата 1.2.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



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

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

PM MAIL ICQ Skype   Вверх
Ceiceron
Дата 2.2.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



ради теста можно попробовать вызвать процедуру не параметризированно:
Код

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

PM MAIL   Вверх
gambit
Дата 2.2.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



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

Цитата

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

Кто то из нас 2 двоих(студия и я) - тупой. Но боюсь что студия вряд ли.
PM MAIL ICQ Skype   Вверх
Ceiceron
Дата 2.2.2010, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



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

В сути, корень ошибки тут один. И мне кажется он где-то в промежутке между выполнением процедуры и чтением результата.
Прототип процедуры можно в студию? Желательно кусок скрипта по ее созданию.
PM MAIL   Вверх
gambit
Дата 2.2.2010, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



Цитата(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 менеджере, процедура чудесно работает
PM MAIL ICQ Skype   Вверх
Ceiceron
Дата 2.2.2010, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



Начнем с того, что процедура, не функция и return делать явно не должна. гипотетический представите, что процедура однажды вернет более чем одно значение. SQL Server пошлет вас подальше при таком обращении. Если хочется использовать именно функцию, то ее и надо писать (только вызываться она будет селектом). Собственно простой эксперимент позволил установить, что из-за return в хранимке все проблемы.
PM MAIL   Вверх
mrbrooks
Дата 2.2.2010, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



gambit, попробуй задать своему параметру свойство Direction = ParameterDirection.Output:
PM MAIL   Вверх
Ceiceron
Дата 2.2.2010, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



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

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

param.Direction = ParameterDirection.ReturnValue;

матчасть
PM MAIL   Вверх
mrbrooks
Дата 2.2.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



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

Точняг! Недобдел.
PM MAIL   Вверх
gambit
Дата 2.2.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



Задачу решил.

Если кому интересно:
Вариант 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());
           }


Оба варианта решают проблему
PM MAIL ICQ Skype   Вверх
Ceiceron
Дата 2.2.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



Первый вариант самый цивильный, второй от лукавого (если конечно подобного не требует задача).
PM MAIL   Вверх
mrbrooks
Дата 3.2.2010, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Ceiceron, все таки Output!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.