54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
1 | |
MS SQL ID связанных таблиц 217.05.2020, 11:06. Показов 7170. Ответов 88
Метки нет (Все метки)
Доброго времени суток, нужен совет(подсказка, пример) по следующей задаче:
Имеются в БД(MSSQL) две таблицы, головная "Покупки" и дополнительная "ПокупкаИнфо". У первой есть первичный уникальный ключ, по полю ID(со свойством IDENTITY). У второй таблицы есть составной "PRIMARY KEY(ПокупкаID,LineItem)". Получается связка такая, на каждый уникальный "Покупки.ID" приходится по нескольку "ПокупкаИнфо.ПокупкаID". С "Покупки.ID" автоматически(в SQL) создаётся новый номер. А вот с "ПокупкаИнфо.ПокупкаID" возникает вопрос: Как в С# сделать так , что бы для "ПокупкаИнфо.ПокупкаID" присваивался тот же номер что и у "Покупки.ID" ? Эта же тема была тут: ID связанных таблиц Но там сказали пойти сюда)
0
|
17.05.2020, 11:06 | |
Ответы с готовыми решениями:
88
Сохранение связанных таблиц Отображение связанных таблиц Работа с Id из связанных таблиц Выборка данных из связанных таблиц |
30.09.2020, 08:36 | 21 | ||||||||||
7-2-3, а причем тут вот это???
Ну и про object уже сказали.
1
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|||||||||||
30.09.2020, 09:47 | 22 | ||||||||||
не пойму, зачем
set @ID = SCOPE_IDENTITY() что за императивщина?
0
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|||||||||||
30.09.2020, 13:52 [ТС] | 23 | ||||||||||
Я пытался вникнуть в [9], но мне просто-напросто знаний не хватает, что бы осмыслить написанное, соответственно и проблемы в самом понимании кода)
Получается каша в голове. На счёт транзакции, я думаю имеется введу едино-разовый обмен данными ? Вроде как, запросы должны выполнится зараз, при одном обмене ? Я уже пытался писать в ветку для новичков, с другим вопросом, но там после решения , модератор меня перекинул в ветку "C# Windows Forms", соответственно по аналогии , я сюда и написал. Добавлено через 17 минут А вот так правильно:
Добавлено через 14 минут
0
|
30.09.2020, 13:58 | 24 |
7-2-3, Параметры в ADO.NET - https://metanit.com/sharp/adonet/2.9.php
И там еще много чего интересного
1
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
||||||||||||||||||||||||||
30.09.2020, 22:28 [ТС] | 25 | |||||||||||||||||||||||||
Прочитал первые 2 страницы, получается они там значение этого параметра idParam(в котором лежит полученный id) выводят на консоль:
Добавлено через 58 минут Поменял на вот эту абру-кадабру:
Понятно почему ноль:
И на счёт транзакций, что бы мои операции выполнялись в "виде одного целостного пакета ", мне нужно напихать вот эти строки:
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
01.10.2020, 12:39 | 26 |
Неправильно.
Есть "Клиент". Есть "сервер". Между ними "разговор". "Фразами". "Клиент" объясняет "серверу" что нужно сделать. Если эти объяснения идут в одной "фразе", то "Сервер" их выполнит все до последнего пункта. Или не выполнит ничего. Из-за ошибки. Любой. Но "Клиент" может свои объяснения оформить в несколько "фраз". И чтобы "Сервер" понял, что все эти "фразы" являются не чем-то самостоятельным, а единым целым, "Клиент" должен перед первой "фразой" сказать что-то типа "Начинаю передавать команды. Получай первую". А после последней "Все, я закончил". Если все это перевести на язык SQL-сервера, то получится : клиент открывает соединение и указывает, что явно запускает транзакцию. Сервер получает такую посылочку, создает у себя соединение и пишет в свой журнал, что открывается новая транзакция, завершение которой отложено и будет выполняться по ожидаемой то клиента этого соединения специальной интструкции. В Вашем случае Вы готовите пакет запросов (скрипт), который содержит все необходимые операции от первой до последней, а именно: 1) Добавление новой записи в Master, 2) Получение UID только что вставленной записи, 3) Добавление в Detail новой записи с использованием UID Master-записи. Все это заворачиваете в единую "фразу" (sqlcommand) и отправляете на сервер одним махом. Никакого дополнительного управления никакой транзакцией не требуется - сервер лучше Вас знает что и как делать. А вот если Вам надо последовательно послать несколько "фраз" (sqlcommand) одну за другой, то для гарантии правильности нужно использовать транзакцию. При этом надо помнить, что слишком большие интервалы между этими "фразами" могут привести к тому, что сервер прервет свое ожидание и "сбросит" транзакцию не дождавшись "финального свистка". Добавлено через 10 минут У Вас в первой "фразе" - sqlcommand выполняется вставка в Master и извлечение нового UID в некую переменную, которую, кстати, надо объявить инструкцией DECLARE перед всеми командами INSERT и SELEST. На этом "фраза" завершается. После этого идет посылка другой "фразы" - вставки в Detail. Но: - Во-первых, Вам надо получить этот самый UID, чтобы использовать далее и который Вы зачем-то возжелали сунуть в некий TextBox. - Во-вторых, не гарантия, что этот самый UID будет актуальным при второй фразе. Запись из Мастера с этим UID вполне может быть уже удалена в другом или даже этом же соединении. Для правильного решения этой проблемы Вам и привели корректный и гарантированный способ в [9]
1
|
01.10.2020, 12:42 | 27 |
Череду этих действий проще всего оформить хранимой процедурой на сервере. И в ней уже сделать BEGIN TRANSACTION, TRY, INSERT, SCOPE_IDENTITY(), INSERT, COMMIT TRAN, CATCH, RAISERROR, ROLLBACK TRAN. Так будет правильнее, надежнее и быстрее, чем гнать три запроса из приложения.
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
01.10.2020, 13:03 | 28 |
0
|
12073 / 8383 / 1280
Регистрация: 21.01.2016
Сообщений: 31,578
|
|
01.10.2020, 13:09 | 29 |
Так человек говорит о ОДНОМ запросе с последовательным набором действий. Тело этого запроса будет полностью соответствовать телу такой хранимой процедуры. Хранимка тут не даёт ровным счётом никаких преимуществ ни в чём.
0
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
||||||
01.10.2020, 21:18 [ТС] | 30 | |||||
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
01.10.2020, 21:42 | 31 |
Что "верно" ? Копипаста ?
А что вместо точек ? И таблицы у Вас называются MASTER и DETAIL ? Добавлено через 1 минуту Попробуйте запрос в MSSMS
0
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
||||||
01.10.2020, 22:27 [ТС] | 32 | |||||
А как всё это привязывать к приложению ?
0
|
12073 / 8383 / 1280
Регистрация: 21.01.2016
Сообщений: 31,578
|
||||||
02.10.2020, 05:55 | 33 | |||||
Нет. Вот так:
IDbConnection.BeginTransaction или TransactionScope ) иначе это всё надо обернуть в BEGIN TRANSACTION и COMMIT TRANSACTION .Ну и русский язык использовать в именовании сущностей - малое фу. А уж смешивать с английским - фу в квадрате.
1
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
02.10.2020, 09:27 | 34 |
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
02.10.2020, 11:09 | 35 |
Одним из способов:
1. На Клиенте. Вот этот скрипт всунуть как строку в sqlcommand, далее проинициализировать параметры и Execute 2. На Сервере Оформить код как хранимку (StoredProc) с параметрами непосредственно в БД (MSSMS) В коде вызывать эту SP опять же с подстановкой параметров - всех, кроме естественно NewId, он определится "внутри". Кстати, нормальной практикой вторым способом является возвращение хранимкой после вставки нового (новых) ID. Они очень могут понадобиться при локализации новой записи после перечитки грида. Ну это для того, чтобы после добавления новой записи в видимую таблицу (грид) именно эта запись становилась текущей, что весьма удобно при изменениях модальными формами.
1
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
||||||
02.10.2020, 23:26 [ТС] | 36 | |||||
Получилась вот такая процедура:
0
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
||||||
03.10.2020, 22:24 [ТС] | 37 | |||||
Нацарапал вот такую кнопочку:
Правда пока только для одной строки, возникает вопрос, тут лучше процедуру доработать или цикл какой-нибудь в кнопочку прилепить ? Что бы из dataGridView4, несколько строк вставлять в базу.
0
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
05.10.2020, 19:25 [ТС] | 39 |
В другой раз я возможно воспользуюсь Вашим советом, но в данном случае хотелось бы как-нибудь "домучить" эту кнопку(пусть и с девятиэтажным кодом).
0
|
12073 / 8383 / 1280
Регистрация: 21.01.2016
Сообщений: 31,578
|
|
05.10.2020, 19:40 | 40 |
Так-то запрос вам может N строк вернуть. Вы их сразу все можете вставить в свой грид.
0
|
05.10.2020, 19:40 | |
05.10.2020, 19:40 | |
Помогаю со студенческими работами здесь
40
Вывод связанных таблиц в DataGridView Обновление связанных таблиц в DataGridView Обновление связанных таблиц в datagridview Отображение полей связанных таблиц Удалить записи из связанных таблиц Вывод записей из связанных таблиц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |