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

Как добавить ключ из таблицы1 и 2 в таблицу3, при создании новой записи

14.08.2013, 11:52. Просмотров 823. Ответов 8
Метки нет (Все метки)

Всем, добрый день!

Есть вопрос.
Имеется 3 таблицы: Tab_users, Tab_offices, Tab_phones.
Таблица Tab_users - основная. В ней созданы столбцы id_user, user, id_office и id_phone.
Таблица Tab_offices содержит: id_office и office
Таблица Tab_phones содержит: id_phone и phone
Список офисов выводится через combobox.
Требуется: при создании новой записи пользователя (в Tab_users.user) и телефона (в Tab_phones.phone), в столбцы id_office и id_phone таблицы Tab_users записать значение (ключ) из столбцов id_office таблицы Tab_offices и id_phone таблицы Tab_phones.
Запись в столбец id_office таблицы Tab_users реализована (элемент combobox1), а вот с текстовыми элементами, через которые вношу данные имени и телефон – не знаю, как сделать.
Мой код:
Кликните здесь для просмотра всего текста

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
37
38
39
40
if (textBox1.Text == "")
            {
                MessageBox.Show("Please enter value", "Error");
                this.textBox1.Focus();
                return;
            }
            Else if (textBox2.Text == "")
            {
                MessageBox.Show("Please enter value", "Error");
                this.textBox2.Focus();
                return;
            }
            else
            {
                object selecteditem = comboBox1.SelectedValue;
                
                int x;
da.InsertCommand = new SqlCommand("INSERT INTO Tab_users (user_name, id_office, id_phone)" + "VALUES(@user_name, @id_office, @id_phone);" 
+ "INSERT INTO Tab_phones (phone)" + "VALUES(@phone);", con);
 
da.InsertCommand.Parameters.Add("@user_name", SqlDbType.VarChar).Value = textBox1.Text;
da.InsertCommand.Parameters.Add("@id_office", SqlDbType.Int).Value = selecteditem;
da.InsertCommand.Parameters.Add("@id_phone", SqlDbType.Int).Value = // что здесь указать? ;
da.InsertCommand.Parameters.Add("@phone", SqlDbType.VarChar).Value = textBox2.Text;
                con.Open();
                x = da.InsertCommand.ExecuteNonQuery();
  textBox1.Clear();
                textBox2.Clear();
                con.Close();
 
                if (x >= 1)
                {
                    MessageBox.Show("Record(s) has been added");
                }
                else
                {
                    MessageBox.Show("Error");
                }
            }


Заранее благодарен.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 11:52
Ответы с готовыми решениями:

Возможно ли заюзать Databinding при создании новой записи?
Есть форма, где в БД добавляется клиент. В БД около 30 разных полей, соответственно на каждое поле...

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

Как избавиться от ошибки при создании новой записи
В запросе часть полей ссылается на таблицу, а часть полей вычисляемые. Одно из полей таблицы (поле...

Событие при создании новой записи
Как называется событие, которое вызывается при создании новой записи?

Узнать `id` (auto_increment) при создании новой записи
Предположим, есть такая таблица: CREATE TABLE `name`( `id` INT(11) VARCHAR AUTO_INCREMENT,...

8
Grishaco
437 / 361 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.08.2013, 14:14 2
Цитата Сообщение от VOLCANO Посмотреть сообщение
и телефона (в Tab_phones.phone)
Как вы добавляете телефон в таблицу?
0
VOLCANO
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 11
14.08.2013, 14:21  [ТС] 3
Цитата Сообщение от Grishaco Посмотреть сообщение
Как вы добавляете телефон в таблицу?
через textbox
0
Grishaco
437 / 361 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.08.2013, 14:25 4
Извиняюсь, не увидел сразу.

Попробуйте вместо вот этого

C#
1
2
da.InsertCommand = new SqlCommand("INSERT INTO Tab_users (user_name, id_office, id_phone)" + "VALUES(@user_name, @id_office, @id_phone);" 
+ "INSERT INTO Tab_phones (phone)" + "VALUES(@phone);", con);
Вот так

C#
1
2
3
da.InsertCommand = new SqlCommand("INSERT INTO Tab_phones (phone)" + "VALUES(@phone);" + 
"INSERT INTO Tab_users (user_name, id_office, id_phone)" + "VALUES(@user_name, @id_office, SCOPE_IDENTITY());" 
, con);
И надо убрать строчку

C#
1
da.InsertCommand.Parameters.Add("@id_phone", SqlDbType.Int).Value = // что здесь указать? ;
0
14.08.2013, 14:25
VOLCANO
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 11
14.08.2013, 15:09  [ТС] 5
C#
1
2
3
4
...
da.InsertCommand = new SqlCommand("INSERT INTO Tab_phones (phone)" + "VALUES(@phone);", con);
da.InsertCommand.Parameters.Add("@phone", SqlDbType.VarChar).Value = textBox2.Text;
...
Добавлено через 39 минут
У меня, на самом деле, таких столбцов, в которые нужно записать ключ из других таблиц, 8 штук.
Получается, что все таблицы, из которых нужно взять ключи, нужно указать перед внесением данных в основную таблицу? Сейчас попробую.

Касательно удаления строки:
C#
1
da.InsertCommand.Parameters.Add("@id_phone", SqlDbType.Int).Value = // что здесь указать? ;
Выдает ошибку:
Must declare the scalar variable "@id_phone"
0
Grishaco
437 / 361 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.08.2013, 15:24 6
Цитата Сообщение от VOLCANO Посмотреть сообщение
Выдает ошибку:
Must declare the scalar variable "@id_phone"
Где то в запросе есть ссылка на переменную.

Цитата Сообщение от VOLCANO Посмотреть сообщение
У меня, на самом деле, таких столбцов, в которые нужно записать ключ из других таблиц, 8 штук.
Получается, что все таблицы, из которых нужно взять ключи, нужно указать перед внесением данных в основную таблицу? Сейчас попробую.
Не получится, т.к. SCOPE_IDENTITY() возвращает только идентификатор последней вставленой записи.


В целом логика должна выглядеть так:

1. Сохраняем сущность (одну), при этом сохраняем с использование ExecuteScalar. Сам запрос выглядит "INSERT INTO Table (a1,a2 и т.д.) VALUES (1,2,3 и т.д.) SELECT SCOPE_IDENTITY()". Он вернет идентификатор записи.
2. Сохраняем в переменную.
3. Повторяем столько раз сколько нужно пункты 1 и 2.
4. Выполняем основной запрос и вот тут еже есть идентификатор записи который необходимо вставить.

C#
1
2
3
4
5
6
7
8
9
10
11
12
da.InsertCommand = new SqlCommand("INSERT INTO Tab_phones (phone) VALUES(@phone) SELECT SCOPE_IDENTITY()", con); 
da.InsertCommand.Parameters.Add("@phone", SqlDbType.VarChar).Value = textBox2.Text;
con.Open();
int phoneId = (int)da.InsertCommand.ExecuteScalar();
 
da.InsertCommand = new SqlCommand("INSERT INTO Tab_users (user_name, id_office, id_phone) VALUES(@user_name, @id_office, @id_phone);", con); 
da.InsertCommand.Parameters.Add("@user_name", SqlDbType.VarChar).Value = textBox1.Text;
da.InsertCommand.Parameters.Add("@id_office", SqlDbType.Int).Value = selecteditem;
da.InsertCommand.Parameters.Add("@id_phone", SqlDbType.Int).Value = phoneId;
 
da.InsertCommand.ExecuteNonQuery();
con.Close();
1
VOLCANO
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 11
14.08.2013, 18:14  [ТС] 7
Цитата Сообщение от Grishaco Посмотреть сообщение
Где то в запросе есть ссылка на переменную.



Не получится, т.к. SCOPE_IDENTITY() возвращает только идентификатор последней вставленой записи.


В целом логика должна выглядеть так:

1. Сохраняем сущность (одну), при этом сохраняем с использование ExecuteScalar. Сам запрос выглядит "INSERT INTO Table (a1,a2 и т.д.) VALUES (1,2,3 и т.д.) SELECT SCOPE_IDENTITY()". Он вернет идентификатор записи.
2. Сохраняем в переменную.
3. Повторяем столько раз сколько нужно пункты 1 и 2.
4. Выполняем основной запрос и вот тут еже есть идентификатор записи который необходимо вставить.

C#
1
2
3
4
5
6
7
8
9
10
11
12
da.InsertCommand = new SqlCommand("INSERT INTO Tab_phones (phone) VALUES(@phone) SELECT SCOPE_IDENTITY()", con); 
da.InsertCommand.Parameters.Add("@phone", SqlDbType.VarChar).Value = textBox2.Text;
con.Open();
int phoneId = (int)da.InsertCommand.ExecuteScalar();
 
da.InsertCommand = new SqlCommand("INSERT INTO Tab_users (user_name, id_office, id_phone) VALUES(@user_name, @id_office, @id_phone);", con); 
da.InsertCommand.Parameters.Add("@user_name", SqlDbType.VarChar).Value = textBox1.Text;
da.InsertCommand.Parameters.Add("@id_office", SqlDbType.Int).Value = selecteditem;
da.InsertCommand.Parameters.Add("@id_phone", SqlDbType.Int).Value = phoneId;
 
da.InsertCommand.ExecuteNonQuery();
con.Close();

Спасибо большое!!!

Немного подредактировал:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
вместо:
SELECT SCOPE_IDENTITY();
и
int phoneId = (int)da.InsertCommand.ExecuteScalar();
 
сделал:
SELECT CAST(scope_identity() AS int)
и
int phoneId;
phoneId = (int)da.InsertCommand.ExecuteScalar();


Вот какой получился код с добавлением ключей из нескольких таблиц:

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
con.Open();
                da.InsertCommand = new SqlCommand("INSERT INTO Tab_phones (phone) VALUES(@phone) SELECT CAST(scope_identity() AS int)", con);
                da.InsertCommand.Parameters.Add("@phone", SqlDbType.VarChar).Value = textBox2.Text;
                int phoneId;
                phoneId = (int)da.InsertCommand.ExecuteScalar();
 
                da.InsertCommand = new SqlCommand("INSERT INTO Tab_ws_names (ws_name) VALUES(@ws_name) SELECT CAST(scope_identity()AS int)", con);
                da.InsertCommand.Parameters.Add("@ws_name", SqlDbType.VarChar).Value = textBox3.Text;
                
                int wsnameId;                 
                wsnameId = (int)da.InsertCommand.ExecuteScalar();
                da.InsertCommand = new SqlCommand("INSERT INTO Tab_users (id_offices, user_name, id_phone, id_ws_name) VALUES (@id_office, @user_name, @id_phone, @id_ws_name)", con);
                da.InsertCommand.Parameters.Add("@user_name", SqlDbType.VarChar).Value = textBox1.Text;
                da.InsertCommand.Parameters.Add("@id_office", SqlDbType.Int).Value = selecteditem2;
                da.InsertCommand.Parameters.Add("@id_phone", SqlDbType.Int).Value = phoneId;
                da.InsertCommand.Parameters.Add("@id_ws_name", SqlDbType.Int).Value = wsnameId;
 
                da.InsertCommand.ExecuteNonQuery();
                con.Close();


Еще раз большое спасибо! Respect!
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
16.08.2013, 12:36 8
как вариант можно создать Представление через ManagmentStudio а на Inset представления повесить триггер.
пример:
1) представление
T-SQL
1
2
3
Select userName, phone, ofice from Tab_users as TU
inner join Tab_phones  as TP on TU.id_phone=TP.id_phone
inner join Tab_offices as TO on TU.id_office =TO.id_office
2) выполняем insert в представление!
T-SQL
1
Inser into UserView Values(userName, phone, office);
3) ТЕЛО тригера Instead Insert
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE @id_phone int;
DECLARE @id_office int;
DECLARE @user nvarchar;
DECLARE @phone nvarchar;
DECLARE @office nvarchar;
DECLARE insert_cursor CURSOR FOR 
Select * from inserted;
 
OPEN insert_cursor 
 
FETCH NEXT FROM insert_cursor 
INTO @user, @phone, @office
 
WHILE @@FETCH_STATUS = 0
BEGIN
     Insert Into Tab_phones  Values(@phone);
     Set @id_phone = SCOPE_IDENTITY();
     Insert Into Tab_offices  Values(@office);
     Set @id_office = SCOPE_IDENTITY();   
     Insert Into Tab_users  Values(@user, @id_phone,  @id_office);
     FETCH NEXT FROM insert_cursor 
     INTO @user, @phone, @office;
END
0
VOLCANO
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 11
28.08.2013, 17:40  [ТС] 9
Спасибо! Буду иметь ввиду.
0
28.08.2013, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 17:40

Дублирование записей при создании новой записи .и фильтр
Здравствуйте!!! Очень нужна помощь. Пару недель назад создавала тему... Сейчас возникла такая...

Автоматичесское заполнение поля при создании новой записи
Есть поле "фото", в котором хранится название файла картинки, которую отображает форма. Я хочу,...

Баг при создании новой записи в БД используя Entity framework
Есть у меня сайт, написанный под ASP .NET MVC 5 и с использованием Entity Framework 6.0 для...


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

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

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