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

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

08.10.2012, 15:22. Показов 1244. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru