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

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

14.08.2013, 11:52. Просмотров 897. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2013, 11:52
Ответы с готовыми решениями:

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

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

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

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

8
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.08.2013, 14:14 2
Цитата Сообщение от VOLCANO Посмотреть сообщение
и телефона (в Tab_phones.phone)
Как вы добавляете телефон в таблицу?
0
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 11
14.08.2013, 14:21  [ТС] 3
Цитата Сообщение от Grishaco Посмотреть сообщение
Как вы добавляете телефон в таблицу?
через textbox
0
438 / 362 / 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
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
438 / 362 / 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
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
1049 / 856 / 195
Регистрация: 31.03.2010
Сообщений: 2,516
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
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 11
28.08.2013, 17:40  [ТС] 9
Спасибо! Буду иметь ввиду.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2013, 17:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

Ошибка ограничения внешнего ключа при создании новой записи
Здравствуйте! Имеется база (SQL Server): Нас интересуют таблицы Chaim(Заявка) и...

Создание папки при создании новой записи в форме Access
Здравствуйте, уважаемые форумчане! Прошу помощи, т.к. сам не владею достаточным объемом знаний в...

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


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

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

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