Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
10 / 10 / 2
Регистрация: 17.11.2011
Сообщений: 84

Хранимая процедура с параметрами в C#

12.06.2013, 23:20. Показов 1668. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть хранимая процедура news
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
USE [kursova]
GO
/****** Object:  StoredProcedure [dbo].[news]    Script Date: 12.06.2013 21:19:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[news]
@kod datetime,
@tow INT
 
AS
BEGIN
SET nocount ON;
 
SELECT    (YEAR(@kod) + dbo.Гарантии.СрокГарантии)AS Год
FROM            dbo.ПроданныеЭкземпляры INNER JOIN
                         dbo.Товары ON dbo.ПроданныеЭкземпляры.КодТовара = dbo.Товары.КодТовара INNER JOIN
                         dbo.Гарантии ON dbo.Товары.НомерГарантии = dbo.Гарантии.НомерГарантии
                         WHERE Товары.КодТовара = @tow
                         GROUP BY Товары.КодТовара, dbo.Гарантии.СрокГарантии
END
Она к дате покупки приплюсовывает срок гарантии и в итоге мы получаем дату окончания гарантии,но суть не в этом, процедура работает нормально. Есть таблица при нажатии на ячейку которой у нас выполняется процедура и в текстбокс выводится результат процедуры. Вот обработчик события:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private void отображение_проданные_экземплярыDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try 
            {
            int v = Convert.ToInt32(отображение_проданные_экземплярыDataGridView[5, отображение_проданные_экземплярыDataGridView.CurrentRow.Index].Value);
            DateTime n = Convert.ToDateTime(отображение_проданные_экземплярыDataGridView[4, отображение_проданные_экземплярыDataGridView.CurrentRow.Index].Value);      
            string connStr = "Data Source=РУСЛАН-ПК\\MSSQLSERVER1;Initial Catalog=kursova;Integrated Security=True";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            using (SqlCommand cm = new SqlCommand("news", conn))
            {
                cm.CommandType = CommandType.StoredProcedure;
                SqlParameter param = new SqlParameter();
                param.ParameterName = "@kod";
                param.Direction = ParameterDirection.Input;
                param.SqlDbType = SqlDbType.DateTime;
                param.Value = n;
 
                cm.Parameters.Add(param);
                param = new SqlParameter();
                param.ParameterName = "@tow";
                param.Direction = ParameterDirection.Input;
                param.SqlDbType = SqlDbType.Int;
                param.Value = v;
 
                cm.ExecuteNonQuery();
 
                textBox2.Text = "???????????";
            }
            }
                catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
                }
            }
В интернете нашел как все это сделать, но частично. Собственно вопрос: как результат процедуры отобразить в текстбоксе? *место обозначил "????????????".
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2013, 23:20
Ответы с готовыми решениями:

Хранимая процедура с OUT параметрами не переносится на MySQL
Хай. Есть процедура на MSSQL . @login nvarchar(50) , @pass nvarchar(200) , @userID int OUTPUT , @stateCode varchar(50) OUTPUT ,...

Простая хранимая процедура с входными параметрами. Поиск входной строки в поле
Добрый день. Создаю процедуру. Необходимо чтобы выводил поля, где поле status = "постоянный". IF OBJECT_ID('Selling_S','P') IS...

Хранимая процедура
Здравствуйте.. Сразу говорю, это первый опыт, пытаюсь научиться, разобраться в принципах работы.. Сделал я такую ХП на MSSQL USE ...

5
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
13.06.2013, 08:37
Что то не то вы нашли в интернете. Почувствуйте разницу:
- ExeucuteNonQuery - Выполняет запрос на базе данных, не возвращая никакого результирующего набора. В первую очередь предназначена для команд INSERT/UPDATE/DELETE.
- ExecuteReader - Выполняет запрос на базе данных и возвращает результирующий набор в виде DbReader.
- ExecuteScalar - Выполняет запрос на базе данных и возвращает значение первого столбца первой строки.
В вашем случае нужен ExecuteScalar.
0
10 / 10 / 2
Регистрация: 17.11.2011
Сообщений: 84
13.06.2013, 23:41  [ТС]
Сделал по своему, получилось так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 private void отображение_проданные_экземплярыDataGridView_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                int v = Convert.ToInt32(отображение_проданные_экземплярыDataGridView[5, отображение_проданные_экземплярыDataGridView.CurrentRow.Index].Value);
                DateTime n = Convert.ToDateTime(отображение_проданные_экземплярыDataGridView[4, отображение_проданные_экземплярыDataGridView.CurrentRow.Index].Value);      
 
                con = new SqlConnection();
                con.ConnectionString = "Data Source=РУСЛАН-ПК\\MSSQLSERVER1;Initial Catalog=kursova;Integrated Security=True";
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandText = "SELECT   rtrim(rtrim(year(@kod)+dbo.Гарантии.СрокГарантии)+'.'+rtrim(month(@kod))+'.'+rtrim(day(@kod))) FROM dbo.ПроданныеЭкземпляры INNER JOIN dbo.Товары ON dbo.ПроданныеЭкземпляры.КодТовара = dbo.Товары.КодТовара INNER JOIN dbo.Гарантии ON dbo.Товары.НомерГарантии = dbo.Гарантии.НомерГарантии where Товары.КодТовара = @tow group by Товары.КодТовара, dbo.Гарантии.СрокГарантии";
 
                cmd.Parameters.Add("@kod", SqlDbType.DateTime, 8);
                cmd.Parameters["@kod"].Value = n;
                cmd.Parameters.Add("@tow", SqlDbType.Int, 8);
                cmd.Parameters["@tow"].Value = v;
 
 
                if (cmd.ExecuteNonQuery() != 0) { DateTime g = Convert.ToDateTime(cmd.ExecuteScalar()); textBox2.Text = g.ToString(); }
            }
            catch (Exception)
            {
            }
            finally
            {
                con.Close();
            }
 
        }
Добавлено через 47 секунд
kodv, спасибо,но не пригодилось)
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.06.2013, 05:32
Цитата Сообщение от ruslannos Посмотреть сообщение
kodv, спасибо,но не пригодилось)
Зря вы гнете свою неправильную линию.
Цитата Сообщение от Описание ExecuteNonQuery
Операторы UPDATE, INSERT и DELETE возвращают количество строк, которые были обработаны с их помощью. Для всех прочих типов операторов возвращаемым значением является -1.
Таким образом ваш cmd.ExecuteNonQuery будет всегда возвращать -1. Какой тогда смысл в вашем if'е? Почему сразу нельзя выбирать результат через ExecuteScalar?
Хотя, дело ваше, хотите, чтобы у вас присутствовал бессмысленный код, и ваша программа выполняла бессмысленные запросы к БД, ради бога. Дело ваше.
0
10 / 10 / 2
Регистрация: 17.11.2011
Сообщений: 84
14.06.2013, 10:03  [ТС]
это не я придумал,это требования руководителя по курсовой,и не важно какой способ используется.
p.s. Все отлично работает

Добавлено через 5 минут
я использую и cmd.ExecuteNonQuery и ExecuteScalar
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.06.2013, 10:28
Вы получаете значение через ExecuteScalar. Естественно, что это будет работать. Об этом и писалось выше.

Я лишь написал, что ExecuteNonQuery, который выполняется для SQL команды SELECT, будет всегда ... Нет, не так, вот так - ВСЕГДА возращать значение -1. Таким образом условие if(cmd.ExecuteNonQuery() != 0) будет ВСЕГДА истинным, а значит код, который находится в блоке if'а, будет ВСЕГДА выполняться. С таким же успехом вы могли бы написать if(true). Но лучше выполнять cmd.ExecuteScalar безусловно. Потому что ветвление в программе используется в том случае, если в момент компиляции не ясно, какое значение будет иметь условие, используемое в ветвлении. В данном же случае ясно, что cmd.ExecuteNonQuery для данного запроса ВСЕГДА вернет -1, а значит условие в if'е ВСЕГДА будет иметь значение true.

Предлагаю дискуссию не продолжать. Я еще в предыдщем посте написал:
Цитата Сообщение от kodv Посмотреть сообщение
Хотя, дело ваше, хотите, чтобы у вас присутствовал бессмысленный код, и ваша программа выполняла бессмысленные запросы к БД, ради бога. Дело ваше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.06.2013, 10:28
Помогаю со студенческими работами здесь

хранимая процедура
Всем привет. Есть 2 таблицы - дороги и мосты. create table road (idroad number NOT NULL CONSTRAINT road_p PRIMARY KEY, road_name...

Хранимая процедура
Ребята, добрый день!!! Я прошу вас о помощи, от безысходности уже :с В общем, существует база данных, таблицы которой клиент, продукт и...

Хранимая процедура
Добрый день. Нужно создать хранимую процедуру (UPDATESALARY) со следующими условиями: 1) Входные данные: ID отдела, PERCENT процент...

Хранимая процедура
Что-то совсем не могу разобраться... Нужно написать хранимую процедуру, которая заполняет столбец таблицы, на основании других столбцов. ...

Хранимая процедура
Доброе утро! Нужно сделать хранимую процедуру для переноса столбца из одной таблицы в 3 других таблицы. В SQL не шарю, поэтому прошу...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru