Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/57: Рейтинг темы: голосов - 57, средняя оценка - 4.81
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53

Вызов хранимой процедуры

05.05.2011, 22:24. Показов 11092. Ответов 14

Студворк — интернет-сервис помощи студентам
Привет! У меня есть база данных и запрос, написанный на SQL в сишарпе. Таблица из базы данных отображается в DataGridView. Мне нужно, чтобы по номеру рейса находились самолеты, занесенные в таблицу. И высвечивались подходящие в этой же или др таблице...но как запрос совместить с самой программой?
Вот запрос:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
ALTER PROCEDURE dbo.StoredProcedure2
    
    (
    @NUMBER INT ,
    @НаправлениеID text OUTPUT
    )
    
AS
     SET NOCOUNT ON 
     SELECT @НаправлениеID = Направление
     FROM TimeTable
     WHERE ([Номер рейса] = @NUMBER)
    RETURN
А вот неудачная (и уже не 1я попытка) сдалать так, чтобы это работало в самой проге:
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
SqlCommand cmd = new SqlCommand();
 
            SqlConnection con = new SqlConnection();
            con.ConnectionString = connectionString;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "[dbo.StoredProcedure1]";
            cmd.Parameters.Clear();
            SqlParameter p1 = cmd.Parameters.Add("@number", SqlDbType.Int);
 
            SqlParameter p2 = cmd.Parameters.Add("@НаправлениеID", SqlDbType.Text);
            p1.Direction = ParameterDirection.Input;
            p1.Value = go.Text;
      
            p2.Direction = ParameterDirection.Output;
            //textBox1.Text = p2.Value.ToString();      ВОТ ТУТ НАДО ЧТОБ ВЫВОДИЛОСЬ В ТАБЛИЦУ
            con.Open();
            try
            {
                cmd.ExecuteNonQuery();
                MessageBox.Show("success!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Source + ex.Message + ex.HelpLink);
            }
            con.Close();
Пожалуйста, помогите мне ))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2011, 22:24
Ответы с готовыми решениями:

Вызов хранимой процедуры
Как вызвать хранимую процедуру в БД Access через Viasual Studio 2015 Community. Хранимые процедуры: Доабвление, удаление из БД, Выборка и...

Вызов хранимой процедуры
Здравствуйте, помогите пожалуйста. Мне нужно сделать, чтобы на форму в ЛистБокс выводилась информация, которую выбирает с сервера...

Вызов хранимой процедуры
Хочу обновить бд с помощью хранимой процедуры ALTER procedure . @id_TP int, @id_worker int, @DT datetime, @id_Texbook int, @col_vo int...

14
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.05.2011, 09:25
Насколько я вижу по Вашему коду -
SQL
1
ALTER PROCEDURE dbo.StoredProcedure2
а в коде программы Вы обращаетесь к
C#
1
cmd.CommandText = "[dbo.StoredProcedure1]";
. Может в этом проблема? Дайте более расширенное описание , что именно не работает, с текстом ошибки например... Мы не телепаты, к сожалению.

Ну и еще вы пытаетесь обратиться к переменной OUTPUT до фактического выполнения запроса.
1
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
06.05.2011, 14:56  [ТС]
Да, спасибо. Я кое что иправила, но это тоже не работает, он говорит что ошибка в ExecuteReader()
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
ALTER PROCEDURE dbo.StoredProcedure1
    
    (
    @NUMBER INT ,
    @НаправлениеID text OUTPUT
    )
    
AS
     SET NOCOUNT ON 
     SELECT  Направление
     FROM TimeTable
     WHERE ([Номер рейса] = @NUMBER)
    RETURN
А вот программа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SqlCommand cmd = new SqlCommand();
 
            SqlConnection con = new SqlConnection();
            con.ConnectionString = connectionString;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "[dbo.StoredProcedure1]";
            cmd.Parameters.Clear();
            SqlParameter p1 = cmd.Parameters.Add("@number", SqlDbType.Int);
 
            SqlParameter p2 = cmd.Parameters.Add("@НаправлениеID",SqlDbType.NVarChar,50);
            p1.Direction = ParameterDirection.Input;
            p1.Value = go.Text;
            con.Open();
            cmd.ExecuteReader();
            con.Close();
            //p2.Direction = ParameterDirection.Output;
            textBox1.Text = p2.Value.ToString();
И ещё, вы не скажете как потом если заработает чтоб в той же таблице (примерно как менеджмент студио) чтоб выводилось?)
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.05.2011, 16:51
Какая именно ошибка? Какой вывод при этом в окно Output ВизуалСтудии? А второй Ваш вопрос вообще, если чесно, не понял. В какой таблице? DataTable, DataGrid, еще какая то... Что именно в менеджмент студии(скриншот например)? ... Извините, не понял ничего
1
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
06.05.2011, 17:41  [ТС]
Простите) ну вот в таком желтельком окне типа когда идет прогон программы пишет "ExecuteReader: Свойство Connection не инициализировано." Вот.
А 2й вопрос вот в чем: мне надо вывести в DataGridView результат. Результат - это информация о рейсе. Ну вообщем: такая прога: есть БД и вот пока что я из неё взяла 1 таблицу(там некая инфа про рейсы), она успешно выводится в ДатаГридВью. Есть текстбокс где пользователь должен ввести номер рейса, программа должна найти по по этому номеру определенный рейс и оставить только его в этой датегридвью.
И вот как когда запрос, состыкованный уже с сишарпом заработает, мне вывести в эту самую датугридвью инфу о найденном рейсе? Это что то через периприсвоение данных? Или как?))
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.05.2011, 17:58
Цитата Сообщение от Mystery_Planet Посмотреть сообщение
Простите) ну вот в таком желтельком окне типа когда идет прогон программы пишет "ExecuteReader: Свойство Connection не инициализировано." Вот.
О!!!! Это уже совсем другое дело! Так попробуйте:
C#
1
2
3
4
5
6
SqlConnection con = new SqlConnection();
            con.ConnectionString = connectionString;
            cmd.Connection= con; //!!!!!!!!!!!!!!!!!!!!!!!
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "[dbo.StoredProcedure1]";
            cmd.Parameters.Clear();
А 2й вопрос вот в чем: мне надо вывести в DataGridView результат. Результат - это информация о рейсе. Ну вообщем: такая прога: есть БД и вот пока что я из неё взяла 1 таблицу(там некая инфа про рейсы), она успешно выводится в ДатаГридВью. Есть текстбокс где пользователь должен ввести номер рейса, программа должна найти по по этому номеру определенный рейс и оставить только его в этой датегридвью.
И вот как когда запрос, состыкованный уже с сишарпом заработает, мне вывести в эту самую датугридвью инфу о найденном рейсе? Это что то через периприсвоение данных? Или как?))
Вот... Тоже уже понятнее. Лучше всего сделать не через прямые запросы SQL , а через DataSet, так будет проще. Там можно и фильтрацию делать, и обновлять данные в базе проще. почитайте тут в форуме - это уже есть, причем не один раз поднимался такой вопрос.
1
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
06.05.2011, 18:42  [ТС]
О!!! У меня кажется кое что заработало(не выдает больше этих желтых ошибок)!! Ухху! Но вот только ничего не выводится, т к я не знаю как это сделать все таки в датугридвью. Я тут написала ещё новый запрос, теперь по крайней мере работает. Вот так получилось:запрос:
SQL
1
2
3
4
5
6
ALTER PROCEDURE process3
@nameFlight INT
AS
SELECT *
FROM TimeTable 
WHERE [Номер рейса]=@nameFlight
Прога:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int q;
            q = int.Parse(textBoxНомер.Text);
            SqlCommand cmd = new SqlCommand();
 
            SqlConnection con = new SqlConnection();
            con.ConnectionString = connectionString;
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "[process3]";
            cmd.Parameters.Clear();
            SqlParameter p1 = cmd.Parameters.Add("@nameFlight", SqlDbType.Int);
 
            //SqlParameter p2 = cmd.Parameters.Add("@НаправлениеID",SqlDbType.NVarChar,50);
            p1.Direction = ParameterDirection.Input;
            
            p1.Value = q;
            con.Open();
            cmd.ExecuteReader();
            con.Close();
Не мог бы ты написать как же именно мне бы вывести в датугридвью то, что теперь нашла сама программа..ну то, что я объясняла. У меня есть датасет если что)
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.05.2011, 18:55
Попробуйте дописать такой код:
C#
1
2
3
4
5
6
           
            p1.Value = q;
            con.Open();
            SqlReader reader=cmd.ExecuteReader();//!!!!!!!
            MyDataGridView.DataSource = reader;//!!!!!
            //закрывать коннектоион здесь наверное не стоит
Через датасет можно сделать с помощью DataAdapter, которому передать SqlCommand, сформированный Вами. Потом DataAdapter.Fill(DataSet,"Какоето_Назван ие"); DataGridView.DataSource=DataSet.Tables["Какоето_Название"]; Ну как то так...
1
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
07.05.2011, 23:45  [ТС]
C#
1
2
3
4
p1.Value = q;
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();//!!!!!!!
            timeTableDataGridView.DataSource = reader;//!!!!!
И таблицы теперь просто все убралось и ничего не осталось, хотя должно было))))
наверное надо как то так чтоб ещё был некий "writer"

Добавлено через 17 часов 33 минуты
Попытка через датаадаптер и ридер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 p1.Value = q;
            con.Open();           
            try
            {
                cmd.ExecuteReader();
                SqlDataReader reader = cmd.ExecuteReader();
                SqlDataAdapter dataAdapter = new SqlDataAdapter();
                dataAdapter.SelectCommand = cmd;
                DataSet ds = new DataSet();
                dataAdapter.Fill(ds, "TimeTable");
                timeTableDataGridView.DataSource = ds.Tables["TimeTable"].DefaultView;
               
            }
            catch (Exception ex)
            {
                MessageBox.Show("Такого рейса нет!");
            }
Но как совместить и как то синхронизовать адаптер и ридер?)))
И что написать вместо "TimeTable" чтобы выводилось только то, что нашла прога через запрос?)

Добавлено через 11 часов 0 минут
Все, разобралась, спасбо, Winsor
0
SATANAblack
18.05.2011, 16:38
А я вот думаю, что если такой записи нет то Exception не вылетет, просто ничего не вернется.
1 / 1 / 0
Регистрация: 22.04.2014
Сообщений: 22
07.12.2016, 17:31
и как, если не секрет?

Добавлено через 1 час 33 минуты
Для будущих поколений, кто заглянет сюда, ответ:
C#
1
2
3
4
5
6
7
8
 
           SqlDataReader reader = com.ExecuteReader();
            using (reader)
            {
                dt = new DataTable();
                dt.Load(reader);
               dataGridView1.DataSource = dt;
            }
0
2 / 2 / 0
Регистрация: 14.10.2015
Сообщений: 58
08.12.2016, 17:14
Mystery_Planet, вот тебе пример процедуры:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
ALTER procedure [dbo].[upkat]
 (
    @id_kat int ,
    @kat nvarchar(20),
    @col int = null output
 )
    as 
        begin
        select @col=COUNT(*) from kat where kat=@kat and id_kat<>@id_kat
            if @col<1
                update kat set kat=@kat where id_kat=@id_kat 
        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
36
        private void button8_Click(object sender, EventArgs e)
        {
             if (textBox3.Text.Length>0)
            {
                    
                    SqlConnection connect2 = new SqlConnection(Form1.connectionstring);
                    connect2.Open();
                    SqlCommand cmu = new SqlCommand("upkat", connect2);
                    cmu.CommandType = CommandType.StoredProcedure;
                    cmu.Parameters.AddWithValue("@kat", textBox3.Text);
          
                    cmu.Parameters.AddWithValue("@id_kat", Convert.ToInt32(dataGridView1[1, dataGridView1.CurrentRow.Index].Value.ToString()));
                    cmu.Parameters.Add("@col", SqlDbType.Int).Direction = ParameterDirection.Output;
                    cmu.ExecuteNonQuery();
 
                            if (Convert.ToInt32(cmu.Parameters["@col"].Value) < 1)
                            {
                                connect2.Close();
                                MessageBox.Show(Form1.msgaddc, Form1.comp, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                textBox3.Clear();
                                this.button1_Click(this, EventArgs.Empty);
                            }
                            else
                            {
                                connect2.Close();
                                MessageBox.Show(Form1.msgadde,Form1.eror,MessageBoxButtons.OK,MessageBoxIcon.Error);
                                textBox3.Clear();
                                this.button1_Click(this, EventArgs.Empty);
                            }
                     }
              else
            {           
                MessageBox.Show("Поле <"+label2.Text+"> - не может быть пустым");        
            }
                
        }
для получения данных выборки с хранимой процедуры, следующий код:
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
        private void button1_Click(object sender, EventArgs e)
        {
 
 
            SqlConnection connect = new SqlConnection(Form1.connectionstring);
            connect.Open();
            SqlDataAdapter adapter = new SqlDataAdapter("selkat", connect);
            adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            if (kat.Length > 0)
            { adapter.SelectCommand.Parameters.AddWithValue("@kat", kat); }
            else
            { adapter.SelectCommand.Parameters.Clear(); };
            DataTable tb = new DataTable();
            adapter.Fill(tb);
            dataGridView1.Refresh();
            dataGridView1.DataSource = tb;
            dataGridView1.ReadOnly = true;
 
            dataGridView1.Columns[1].Visible = false;
            dataGridView1.Columns[2].HeaderText = "Категория";
            dataGridView1.Columns[2].Width = 190;
 
            dataGridView1.Columns[0].DisplayIndex = 2;
            dataGridView1.Columns[2].DisplayIndex = 1;
 
            connect.Close();
 
        }
Думаю разберешься
0
1 / 1 / 0
Регистрация: 22.04.2014
Сообщений: 22
08.12.2016, 17:53
metalistik1, не думаю, что автору темы спустя 5 лет нужен ответ на его вопрос.)
Тем более, он же сам написал, что разобрался.)))))
А просто заполнить datagridview можно и моим способом.)))
0
2 / 2 / 0
Регистрация: 14.10.2015
Сообщений: 58
08.12.2016, 19:17
Kaiser Funf, да я что то и не посмотрел, ахахх , ты видимо тоже не смотрел
0
1 / 1 / 0
Регистрация: 22.04.2014
Сообщений: 22
08.12.2016, 20:23
metalistik1, нет, я ответила потому, что в последнем сообщении автора темы только написано, что он разобрался, как передать из ридера данные дальше, но не сказано как.
Я описала, как можно спокойно передать данные с ридера хоть куда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2016, 20:23
Помогаю со студенческими работами здесь

Вызов хранимой процедуры
Добрый день У меня есть процедура хранимая в MySQL на добавление строки CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`(IN `fam`...

Вызов хранимой процедуры
есть хранимая процедура. Надо ее вызвать и что бы она заменила один столбец в БД. если что проект делаю в WPF

Вызов хранимой процедуры в форме
Доброго времени суток. В C# я ламер. Стоит visual studio, SQL Server 2008. Есть хранимая процедура в SQL на добавление нового пользователя....

Вызов хранимой процедуры из MySQL
Сразу скажу что в vs 2010 работал мало и только перехожу на него с Delphi, поэтому прошу сильно не ругать. Имеется mysql база с кучей...

Вызов хранимой процедуры в FirebirdSQL
Вызываю хранимую процедуру в FirebirdSQL. Вот так: FbCommand res = new FbCommand(&quot;SP_SET_TEST_DATA&quot;); ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru