С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244

Транзакция добавляет записи, но самой связи между данными не устанавливает

08.10.2012, 15:22. Показов 1212. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Написал транзакцию, но в результате он добавляет данные в связанные таблицы, но самой связи между данными не устанавливает, тем самым генерируя потерянные записи.
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
41
42
43
44
45
46
47
48
49
50
private void InsertObjectButton_Click(object sender, EventArgs e)
        {
            #region Кнопка добавления с ТРАНЗАКЦИЕЙ            
                        
            
            OleDbCommand InsertCommand = new OleDbCommand(); 
            InsertCommand.Connection = MainForm.MainConnection; 
            OleDbTransaction InsertTransaction = null;                     
            InsertCommand.Transaction = InsertTransaction;
 
            try
            {
                
 
                MainForm.MainConnection.Open();
                InsertTransaction = MainForm.MainConnection.BeginTransaction();
                InsertCommand.Transaction = InsertTransaction;
               
                            
                // Пошел первый запрос транзакции!
                InsertCommand.CommandText = "INSERT INTO Продавцы (ФИО) VALUES ('ТестовоеФИО')";
                InsertCommand.ExecuteNonQuery(); // Выполняем запрос!
                
                // Пошел второй запрос транзакции!
                InsertCommand.CommandText = "INSERT INTO Адрес (Улица) VALUES ('ТестоваяУлица')";
                InsertCommand.ExecuteNonQuery(); // Выполняем запрос!
 
                // Пошел третий запрос транзакции!
                InsertCommand.CommandText = "INSERT INTO Объекты (НазваниеОбъекта) VALUES ('Тестовое название')";
                InsertCommand.ExecuteNonQuery(); // Выполняем запрос!
 
                // Сохраняем результат транзакции, если успешно завершилась!
                InsertTransaction.Commit();
                MessageBox.Show("Объект успешно добавлен");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                try
                {                
                    InsertTransaction.Rollback(); // Откат транзакции в случае провала
                }
                catch
                {
                    // Do nothing here; transaction is not active.
                }
            }                   
            MainForm.MainConnection.Close();
            #endregion
        }
DataSet в проекте есть, связи установлены. Где что я сделал неправильно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2012, 15:22
Ответы с готовыми решениями:

Вирус устанавливает программы, добавляет ссылки на рабочий стол (логи внутри)
Здравствуйте! Хватанула вирус. При запуске системы открывался браузер с workno.ru, поиск перенаправлялся на рамблер через какой-то...

Вывести разность между самой большой и самой маленькой цифрой в 16-й системе счисления
Дано число в 10-й системе счисления. Вывести разность между самой большой и самой маленькой цифрой в 16-й системе счисления.

Определить расстояние между самой дальней и самой близкой точкой по отношению к началу координат.
С помощью действительной матрицы 2 на n на плоскости задано n точек, так, что Х1,j и Х2,j координаты j-ой точки. Определить расстояние...

12
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.10.2012, 15:32
Цитата Сообщение от Void-87
Написал транзакцию, но в результате он добавляет данные в связанные таблицы, но самой связи между данными не устанавливает, тем самым генерируя потерянные записи.
У тебя какая-то путаница с терминологией. Приведи структуру таблиц и что ты хочешь, чтобы СУБД сделала, но не делает (конретно с названиями столбцов)
0
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
08.10.2012, 15:52  [ТС]
Я хочу добавить связанную запись в таблицу Объекты, столбец НазваниеОбъекта, в таблицу Адрес, столбец Улица, таблица Продавцы, столбец ФИО.

Транзакция все добавляет, но запись получается несвязанной - потерянной. КодПродавца и КодАдреса не добавляется в таблице Объекты.
0
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
08.10.2012, 15:54  [ТС]
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.10.2012, 16:18
Цитата Сообщение от Void-87
КодПродавца и КодАдреса не добавляется в таблице Объекты.
Ну я так и предположил, но хотел уточнить. Так вот, и не должен добавляться. Откуда СУБД знает, что ты хочешь привязать именно к этому продавцу и к этому адресу? Если я добавляю дочку (т.е. запись в дочернюю таблицу), то я могу ее привязать к любому родителю или оставить вообще непривязанной. Например, классический пример - подразделения и сотрудники. Если я вставляю сотрудника, я его могу сразу привязать к подразделению, а могу оставить непривязанным (либо временно, ибо неизвестно куда пойдет, либо вообще постоянно). Т.е. привязка дочек к родителям производится только вручную. Либо сразу после INSERT родителя я узнаю его Id и вставляю его в INSERT дочки, либо позже путем UPDATE - зависит от бизнес-условий. Могу сначала "набить" таблицу родителей, а только потом добавлять дочек (это достаточно распространенный вариант).
А представь себе, что я в одной транзакции вставлю несколько родителей и несколько дочек. Как СУБД разберется, кого с кем связывать?
0
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
08.10.2012, 16:29  [ТС]
То есть мне, по сути, нужно сделать следующие действия:
1. Запрос на добавление в одну из таблиц. Сгенерилась айдишка.
2. Запрос на добавление сгенериной айдишки в предыдущей таблице, в другую таблицу с которой мы хотим связать.
3. И так далее.

Верно?

Добавлено через 1 минуту
Как примерно будет написан запрос? Я не совсем понял как это будет по синтаксису

Добавлено через 6 минут
Не понимаю как я буду ловить айдишку свежедобавленной записи
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.10.2012, 16:33
Ну да.
1. INSERT в родительскую таблицу
2. В зависимости от СУБД (если Id генерится автоматом, например, триггер, автоинкремент и проч.) получаешь Id либо сразу же (скажем, в Oracle INSERT... VALUES... RETURNING id INTO v_id) или последующим действием (скажем, в MySQL вызов функции LAST_INSERT_ID() ).
3. Если, как в твоем случае, несколько родит. таблиц, повторяешь п.1..2 для каждой
4. INSERT INTO Object(name, Id_addr) VALUES('ABCD', <полученный в п.2 Id>)
1
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
08.10.2012, 16:51  [ТС]
SQL
1
2
INSERT INTO Продавцы (ФИО) VALUES ('Ёклмн')
INSERT INTO Объекты (НазваниеОбъекта, КодОбъекта) VALUES ('Хоромы', LAST_INSERT_ID())
Так?

На функцию LAST_INSERT_ID() ругается. Видать нету ее в субд access
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.10.2012, 17:02
Цитата Сообщение от Void-87
Видать нету ее в субд access
По этому поводу ты на форуме Access спроси. Тут я пас.
0
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
11.10.2012, 11:42  [ТС]
Поиски не увенчались успехом. Поэтому буду рад подсказкам по теме.

Добавлено через 4 часа 25 минут
Может ли мне в этом помочь метод OleDbCommand.ExecuteScalar?
Судя по описанию он возвращает то что мне и нужно, первую строку первого столбца результирующего значения. То есть ID как раз.

Добавлено через 23 часа 28 минут
Ап темы. Не могу найти решение никак. Все еще требуется помощь

Добавлено через 20 часов 20 минут
Решение нашел. Способ вызывает негодование, однако он реализует то что я хочу.

Ответ здесь.
https://www.cyberforum.ru/ado-... 99481.html
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
11.10.2012, 11:50
Цитата Сообщение от Void-87
Решение нашел. Способ вызывает негодование, однако он реализует то что я хочу.
Находить MAX и брать его для дочерней таблицы - нормальный способ, но... для однопользовательской работы с БД. Если одновременно с тобой с этой таблицей работает еще кто-то, то можно пролететь.
0
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
11.10.2012, 16:57  [ТС]
Подключение открывается и закрывается по нажатию кнопки. Как кто-то успеет влезть между?
Если я правильно понял, то таблица заблокируется пока с ней работает один юзверь, значит другой не сможет в это же мгновение добавлять запись.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
11.10.2012, 17:02
Цитата Сообщение от Void-87
Если я правильно понял, то таблица заблокируется пока с ней работает один юзверь, значит другой не сможет в это же мгновение добавлять запись.
Честно говоря, с Access не работал, поэтому не знаю, как там устроено. Но в нормальных СУБД при операциях со строками таблицы сама она не блокируется, иначе это была бы смерть многопользовательской работы.
Представь себе, что с таблицей одновременно работает 100 человек (а бывает и больше). Если при каждой операции 99 будут ждать одного, это ж какое будет быстродействие?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2012, 17:02
Помогаю со студенческими работами здесь

Определить разницу в месяцах и днях между самой ранней и самой поздней датами, относящимися к заданному году
Решить задачу с использованием структуры «бинарный файл» (в файле хранятся величины типа «структура» - struct). Определить разницу в...

Транзакция денег между пользователями на сайте
Добрый день, у меня есть идея создания одного сервиса, так как я не являюсь Веб-программист и не имел дела с транзакцией денег в...

Не могу убрать вывод миниатюры записи в самой записи
Содержание (single.php), нужной строчки для переделки я не нашел, помогите кто разбирается и подскажите что мне необходимо изменить и где....

Не добавляет записи в бд
Здравствуйте, по урокам сделаны два файла: index.php, store.php и бд MySQL examles01. Записи в таблицу не добавляются. Так как я вообще...

Не добавляет записи в БД
Доброго всем времени суток. Возникла такая проблема. Была форма с парой инпутов на добавление записей в БД. Добавляло все как надо....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru