Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/36: Рейтинг темы: голосов - 36, средняя оценка - 4.64
Mystery_Planet
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
#1

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

05.05.2011, 22:24. Просмотров 6564. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2011, 22:24
Ответы с готовыми решениями:

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

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

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

Вызов хранимой процедуры
Добрый день У меня есть процедура хранимая в MySQL на добавление строки ...

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

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

Ну и еще вы пытаетесь обратиться к переменной OUTPUT до фактического выполнения запроса.
1
Mystery_Planet
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
06.05.2011, 14:56  [ТС] #3
Да, спасибо. Я кое что иправила, но это тоже не работает, он говорит что ошибка в 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
Winsor
329 / 265 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.05.2011, 16:51 #4
Какая именно ошибка? Какой вывод при этом в окно Output ВизуалСтудии? А второй Ваш вопрос вообще, если чесно, не понял. В какой таблице? DataTable, DataGrid, еще какая то... Что именно в менеджмент студии(скриншот например)? ... Извините, не понял ничего
1
Mystery_Planet
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
06.05.2011, 17:41  [ТС] #5
Простите) ну вот в таком желтельком окне типа когда идет прогон программы пишет "ExecuteReader: Свойство Connection не инициализировано." Вот.
А 2й вопрос вот в чем: мне надо вывести в DataGridView результат. Результат - это информация о рейсе. Ну вообщем: такая прога: есть БД и вот пока что я из неё взяла 1 таблицу(там некая инфа про рейсы), она успешно выводится в ДатаГридВью. Есть текстбокс где пользователь должен ввести номер рейса, программа должна найти по по этому номеру определенный рейс и оставить только его в этой датегридвью.
И вот как когда запрос, состыкованный уже с сишарпом заработает, мне вывести в эту самую датугридвью инфу о найденном рейсе? Это что то через периприсвоение данных? Или как?))
0
Winsor
329 / 265 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.05.2011, 17:58 #6
Цитата Сообщение от 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
Mystery_Planet
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
06.05.2011, 18:42  [ТС] #7
О!!! У меня кажется кое что заработало(не выдает больше этих желтых ошибок)!! Ухху! Но вот только ничего не выводится, т к я не знаю как это сделать все таки в датугридвью. Я тут написала ещё новый запрос, теперь по крайней мере работает. Вот так получилось:запрос:
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
Winsor
329 / 265 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.05.2011, 18:55 #8
Попробуйте дописать такой код:
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
Mystery_Planet
1 / 1 / 0
Регистрация: 05.05.2011
Сообщений: 53
07.05.2011, 23:45  [ТС] #9
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
0 / 0 / 0
Регистрация: 05.02.2009
Сообщений: 2
18.05.2011, 16:38 #10
А я вот думаю, что если такой записи нет то Exception не вылетет, просто ничего не вернется.
0
Kaiser Funf
1 / 1 / 0
Регистрация: 22.04.2014
Сообщений: 22
07.12.2016, 17:31 #11
и как, если не секрет?

Добавлено через 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
metalistik1
2 / 2 / 0
Регистрация: 14.10.2015
Сообщений: 57
08.12.2016, 17:14 #12
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
Kaiser Funf
1 / 1 / 0
Регистрация: 22.04.2014
Сообщений: 22
08.12.2016, 17:53 #13
metalistik1, не думаю, что автору темы спустя 5 лет нужен ответ на его вопрос.)
Тем более, он же сам написал, что разобрался.)))))
А просто заполнить datagridview можно и моим способом.)))
0
metalistik1
2 / 2 / 0
Регистрация: 14.10.2015
Сообщений: 57
08.12.2016, 19:17 #14
Kaiser Funf, да я что то и не посмотрел, ахахх , ты видимо тоже не смотрел
0
Kaiser Funf
1 / 1 / 0
Регистрация: 22.04.2014
Сообщений: 22
08.12.2016, 20:23 #15
metalistik1, нет, я ответила потому, что в последнем сообщении автора темы только написано, что он разобрался, как передать из ридера данные дальше, но не сказано как.
Я описала, как можно спокойно передать данные с ридера хоть куда.
0
08.12.2016, 20:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2016, 20:23

Вызов хранимой процедуры в FirebirdSQL
Вызываю хранимую процедуру в FirebirdSQL. Вот так: FbCommand res...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru