Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
1

Процедура в приложении не возвращает значения

20.05.2013, 02:13. Показов 1923. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть элементарная процедура T-SQL привязанная к БД
SQL
1
2
3
4
ALTER PROCEDURE dbo.Procedure_sql
AS
DECLARE @ret INT = 123
RETURN @ret
Естественно получаем возвращаемое значение @RETURN_VALUE = 123

Подключаем через "Мастер настройки источника данных" VS2010 к своему приложению эту процедуру.
Она заносится в QueriesTableAdapter.
Пытаемся выполнить ее в приложении.
C#
1
2
3
4
Data_Base_sql_engDataSetTableAdapters.QueriesTableAdapter proc_SQL;
            proc_SQL = new Data_Base_sql_engDataSetTableAdapters.QueriesTableAdapter();
            int temp;
            temp = proc_SQL.Procedure_sql();
И получаем в temp значение -1.
В чем причина? И как получить нормальное значение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2013, 02:13
Ответы с готовыми решениями:

Процедура возвращает столбец вместо одного значения
Доброй ночи!Мне нужно вернуть накопленную переменную SM. Это сумма просумированных SU. Но почему...

Процедура не возвращает значение
Проблема вот в чем,в одной процедуре создаётся дерево оптимального поиска,а в другой происходит...

Что возвращает процедура?
Привет всем) Пишу свой класс, в нем есть поле _spProc: TADOStoredProcedure; и есть функция,...

Что возвращает процедура?
Не могу понять, что тут процедура принимает в качестве аргументов, а что возвращает? subroutine...

12
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
20.05.2013, 04:47 2
Через QueriesTableAdapater вы можете выполнять команды либо как Scalar, либо как NonQuery (Настроивается в дизайнере).
Scalar возвращает значение первой ячейки первого столбца из результирующего набора.
NonQuery возвращает количество обработанных коммандами INSERT, UPDATE или DELETE строк.
Вы же хотите получить значение параметра @RETURN_VALUE. Это нужно делать через коллекцию параметров.
1
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
20.05.2013, 15:02  [ТС] 3
Что-то я бился пол дня, но так и не понял как это сделать =/
Я так понял что-то вроде этого должно быть?
C#
1
2
3
4
5
SqlParameter p=new SqlParameter("@RETURN_VALUE",SqlDbType.Int);
p.Direction=ParameterDirection.ReturnValue;
command.Parameters.Add(p);
command.ExecuteNonQuery();
returnValue=p.Value;
Только все равно значение не возвращает =(
Походу возвращаемая переменная находится в command.Parameters[0]? Млин, я вообще запутался.
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
20.05.2013, 16:06 4
Используйте дизайнер. Он надежнее. Если он в вашей ХП найдет @RETURN_VALUE, значит в этом @RETURN_VALUE будет гарантированно находится значение, возвращаемое при помощи RETURN из ХП. Вы в первом случае использовали же дизайнер, что ж вас на ручное написание рутинного кода потянуло?
1
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
20.05.2013, 17:11  [ТС] 5
Не понял, какой дизайнер и как с помощью его найти @RETURN_VALUE ?
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
20.05.2013, 17:44 6
Эммм ... Дизайнер - это средство, при помощи которого можно визуально проектировать приложение. Я так понял, в свою QueriesTableAdapter через дизайнер делали. Вот там выберите свою продцедуру, зайдите в коллекцию параметров и посмотрите, какие параметры дизайнер автоматически определяет.
1
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
20.05.2013, 18:35  [ТС] 7
Так да, смотрю коллекцию параметров своей хранимой процедуры, вижу выходное @RETURN_VALUE в этой коллекции под номером [0].
Я не знаю как добраться из приложения к этому значению.
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
20.05.2013, 18:53 8
Самой простой способ:
C#
1
command.Parameters["@RETURN_VALUE"].Value;
1
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
20.05.2013, 20:18  [ТС] 9
А что за переменная command?
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
21.05.2013, 05:11 10
Некий объект типа SqlCommand (я так понял, у вас БД MS SQL Server). Вы парой постов выше используете объект с таким же именем.
1
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 7
22.05.2013, 14:52  [ТС] 11
Все, получилось. Делал по такому шаблону:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
string connectionString = 
  @"Server=L40\YUKON; Initial Catalog=AdventureWorks; Integrated Security=True;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
    using (SqlCommand cmd = new SqlCommand("dbo.TestReturn"))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@Invalue", 3));
 
        SqlParameter returnValue = new SqlParameter("@Return_Value", DbType.Int32);
        returnValue.Direction = ParameterDirection.ReturnValue;
 
        cmd.Parameters.Add(returnValue);
 
        conn.Open();
        cmd.Connection = conn;
 
        cmd.ExecuteNonQuery();
        int count = Int32.Parse(cmd.Parameters["@Return_Value"].Value.ToString());
        Response.Write("<p>Return Code: " + count.ToString());
        conn.Close();
    }
}
0
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 3
21.02.2019, 12:03 12
Привет.
Так никто и не смог добраться до параметров через TableAdapter?
В отладчике параметры видно через структуру CommandCollection, а в коде такого нет. И там нужные значения, а сама хранимка возвращает null.
0
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 3
22.02.2019, 12:11 13
Может кому пригодится. В инете ответа нормального не нашел.
Выкрутился так.
На DataSet.xsd переходим к коду. В нем создает нужный partial class, в который добавляем новый метод, код для которого берем из DataSet.Disigner.cs (метод созданный VS). В нем подменяем кусок вызова хранимой процедуры:

C#
1
returnValue = command.ExecuteNonQuery();
было

заменили на
C#
1
2
3
4
5
6
7
8
9
10
                command.ExecuteNonQuery();
                int i = command.Parameters.IndexOf("@RETURN_VALUE");
                if (i > -1)
                {
                    returnValue = (int)command.Parameters[i].Value;
                }
                else
                {
                    returnValue = -1;
                }
Все на выходе этого метода содержимое параметра @RETURN_VALUE, полученный по команде return в ХП.

Можно еще не partial class, а создать новый класс, унаследованный от исходного. И там либо переопределить исходный метод, либо так же создать новый как описано выше.

Не запутайтесь с namespace.
0
22.02.2019, 12:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2019, 12:11
Помогаю со студенческими работами здесь

Хранимая процедура ничего не возвращает
Добрый день. Суть проблемы такова: создаю хранимую процедуру, в которой во временную таблицу...

DataGridView и хранимая процедура - возвращает два отчета
Хранимая процедура SQL Server sp_helplogins возвращает две таблицы. Если связываю с DataGridView то...

Хранимая процедура возвращает только одну запись
Создал хранимую процедуру create PROCEDURE &quot;TREN&quot; ( &quot;FAM&quot; VARCHAR(30) CHARACTER SET WIN1251 )...

Собственная процедура/функция которая возвращает код символа
Помогите пожалуйста создать собственную процедуру/функцию которая возвращает код символа. Вводим:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru