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

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

14.08.2013, 11:52. Показов 1660. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2013, 11:52
Ответы с готовыми решениями:

Как добавить ключ из двух таблиц в третюю, при создании новой записи
Коллеги, добрый день! Прошу прощения за повтор темы: https://www.cyberforum.ru/ado-net/thread937801.html Изначально нужно было...

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

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

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

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

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  [ТС]
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
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от 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
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
16.08.2013, 12:36
как вариант можно создать Представление через 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  [ТС]
Спасибо! Буду иметь ввиду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2013, 17:40
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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