|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
MS SQL ID связанных таблиц 217.05.2020, 11:06. Показов 8791. Ответов 88
Метки нет (Все метки)
Доброго времени суток, нужен совет(подсказка, пример) по следующей задаче:
Имеются в БД(MSSQL) две таблицы, головная "Покупки" и дополнительная "ПокупкаИнфо". У первой есть первичный уникальный ключ, по полю ID(со свойством IDENTITY). У второй таблицы есть составной "PRIMARY KEY(ПокупкаID,LineItem)". Получается связка такая, на каждый уникальный "Покупки.ID" приходится по нескольку "ПокупкаИнфо.ПокупкаID". С "Покупки.ID" автоматически(в SQL) создаётся новый номер. А вот с "ПокупкаИнфо.ПокупкаID" возникает вопрос: Как в С# сделать так , что бы для "ПокупкаИнфо.ПокупкаID" присваивался тот же номер что и у "Покупки.ID" ? Эта же тема была тут: ID связанных таблиц Но там сказали пойти сюда)
0
|
|
| 17.05.2020, 11:06 | |
|
Ответы с готовыми решениями:
88
Отображение связанных таблиц Работа с Id из связанных таблиц |
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
||||||
| 05.10.2020, 20:09 [ТС] | ||||||
|
мм, если я правильно понял, то нет.
Мне нужен один ID для всех строк в datagridview, вот как тут было:
0
|
||||||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
| 05.10.2020, 22:24 | |
|
Т.е. добавляется не новый документ с единственной строкой, а документ с произвольным кол-вом строк ?
Тогда хранимкой тут не пахнет Вернее, можно хранимкой - если написать хранимку, которая будет проверять наличие заголовка в таблице документов и добавлять новый, если нет, с извлечением id. Или использовать id уже записанного. И так в цикле доя всех строк. Цикл, еснно, на стороне Клиента. И все в одной транзакции. Но это - плохо. А вот если взять "отвертку" типа уже присоветанного Вам Dupper, то там все это безобразие лепится легче, прочнее и красивше. Однако есть тут одна концептуальная вещь. Дело в том, что сложные многоуровневые сущности типа Вашего документа, хранятся, как правило, в разных таблицах. Интерфейс работы с этими сущностями надо организовывать правильно. В данном случае есть список документов (1-й грид) и список строк по текущему выбранному в 1-м гриде документу (2-й грид). Т.е. имеем 2 датасета, связанных отношением "один-ко-многим", отображаемым в двух сетках. Юзер, "гуляя" про 1-му гриду, видит меняющееся содержимое 2-го грида. Правка в списке документов: - Добавление. По введенным данным добавляется новый документ, датасет перечитывается - в результате в 1-м гриде видим только что добавленный документ, а в 2-м гриде - "чисто". - Изменение. Тут все ясно - изменение неключевых реквизитов документв никак не трогает все его содержимое, т.е. подчиненные строки остаются те же. - Удаление. Сначала удаляются все подчиненные строки, а потом заголовок. После перечитки в 1-м гриде не будет удаленного заголовка (как и всех строк в подчиненной таблице), а 2-й грид будет показывать детализацию по той строчке 1-го грида, которая станет текущей после удаления. Правка в списке строк. Тут все просто, т.к. есть парентский id. Эти правки не должны быть совместимы ! Т.е. одна форма для работы с заголовком документа, другая - для работы с его содержимым, т.е. строками. Визуально для юзера такая технология будет намного понятнее нежели добавление "скопом". В частности, он может прервать свою работу в любой момент, запостив последнюю форму. А потом возобновить ее тоже в любой момент. А как это грамотно сделать, если все надо заводить "разом", а в документе 1000 строк ? Будет конкретный геморрой с какими-то буферами, откатами и подтверждением.
1
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
||
| 06.10.2020, 07:14 | ||
|
Если позиций в оплаченной корзине много, то я не вижу проблемы разбить этот запрос на два. В первом вы вносите запись в "Покупки" и получаете ID. Второй собираете в цикле в один пакет (одна строка SQL-запроса) и отправляете в базу. Всё это завернуть в транзакцию, естественно. В цикле N запросов в базу отправлять не рекомендую. Это не есть эффективно.
0
|
||
|
|
|
| 06.10.2020, 09:18 | |
|
7-2-3, можно еще использовать DataSet, конкуренция в нем реализована, пакетное обновление тоже. Только нужно в нем правильно настроить адаптеры таблиц, чтоб не грузили лишнего в память. Его можно создать конструктором в VS, все будет красиво и понятно, как на диаграмме в SSMS
И будут строго типизированные наборы данных, с которыми оперировать уже гораздо проще.
0
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
|
| 06.10.2020, 09:58 | |
|
Andrey-MSK, вряд ли это правильный совет) Этот класс - пережиток прошлого. Да, его можно использовать. Но суммарное количество телодвижений будет если не такое же как с чистым классом и парой запросов, то даже больше. А в наглядности код явно проиграет.
0
|
|
|
|
|
| 06.10.2020, 10:20 | |
|
Usaga, а чего там много телодвижений будет?
Создал библиотеку классов, сделал там DataSet с парой таблиц и связями (все делается мышой ). Получилось два адаптера и восемь методов - два Fill(настраивается для выгрузки только того что надо) и по два Update, Insert, Delete. Потом создал проект WinForms, подключил свой DAL и используй восемь методов и два адаптера. Остальное, что внутри сборки с DAL, волновать не должно. Тем более ТС пишет на WF, а DataSet как раз для него ![]() Если надо еще таблицу добавить в DAL, открываешь проект, правишь схему, сохраняешь и пересобираешь. Появится еще один адаптер и четыре метода А если просто запрос на выборку туда добавить, то появится только один адаптер и один метод.
0
|
|
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
| 06.10.2020, 10:39 [ТС] | |
|
Если позиций в оплаченной корзине много, то я не вижу проблемы разбить этот запрос на два. В первом вы вносите запись в "Покупки" и получаете ID. Второй собираете в цикле в один пакет (одна строка SQL-запроса) и отправляете в базу. Всё это завернуть в транзакцию, естественно.
А можно поподробнее ?
0
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
|
| 06.10.2020, 10:53 | |
|
0
|
|
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
| 06.10.2020, 14:39 [ТС] | |
|
Ну, в принципе как бы, мысль вроде понятна, но мне хотя примерчик бы какой-нибудь, а то даже практиковаться не получается)
0
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
|
| 06.10.2020, 14:53 | |
|
7-2-3, примерчик чего? Как запрос в базу отправить? Так вы сами это умеете, если судить по первой странице этой темы. С текстом запроса тоже уже определились. Что ещё надо?)
0
|
|
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
| 06.10.2020, 16:54 [ТС] | |
|
мм, а эти два запроса должны у меня срабатывать с одной кнопочки, объединённые в одной транзакции ?
Я просто изначально, делал примерно так(просто ради эксперимента): Создал 2 кнопки, в одной отправлялись данные в таблицу Покупки, а во второй(ПокупкиИнфо) приходилось в datagreedview ставить вручную ID.
0
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
||
| 06.10.2020, 16:57 | ||
|
0
|
||
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|||||||||||
| 06.10.2020, 21:26 [ТС] | |||||||||||
|
Пока вот только первая процедура для возврата ID в приложение (и то вызывает сомнения):
Вот моя многострадальная кнопочка(пока только без ПокупкиИнфо):
Дополнительные сведения: Для процедуры или функции NewID2 указано слишком много аргументов. Я хотел пока вставить ID в переменную New_ID, не получилось(
0
|
|||||||||||
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
||||||
| 07.10.2020, 04:39 | ||||||
|
7-2-3, да блин. Вот так это может выглядеть с применением Dapper.NET:
Кликните здесь для просмотра всего текста
Dapper сам за вас всё сделает. Я же не просто так вам эту штуку рекомендовал посмотреть.
1
|
||||||
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
| 07.10.2020, 11:50 [ТС] | |
|
Установил Install-Package Dapper -Version 1.42.0.
Застрял с директивой: using System.Transactions; VS, почему то считает что она не нужна, как её победить не знаю.
0
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
|||
| 07.10.2020, 12:00 | |||
|
Затем найдите и поставьте галочку:
0
|
|||
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
| 07.10.2020, 12:09 [ТС] | |
|
Последняя версия dapper, не хотела ставиться в решение, ругается при установке на версию framework 4.5.2(видимо ему такая нужна).
0
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
|
| 07.10.2020, 12:10 | |
|
7-2-3, а, может быть) Я бы просто поднял версию .NET Framework в проекте минимум до 4.6.1. А лучше сразу до максимальной - 4.8
0
|
|
|
54 / 6 / 5
Регистрация: 24.01.2019
Сообщений: 171
|
|
| 07.10.2020, 14:38 [ТС] | |
|
А вот тут ему моя собачка не нравится:
0
|
|
|
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,916
|
|
| 07.10.2020, 14:51 | |
|
7-2-3, версию языка C# поднимите. И версию .NET Framework. Или не используйте эту фичу) Я это использовал только, чтобы текст запроса красиво и читаемо в коде выглядел. Не более того.
Добавлено через 2 минуты Или поменяйте местами доллар и собачку.
0
|
|
| 07.10.2020, 14:51 | |
|
Выборка данных из связанных таблиц Вывод связанных таблиц в DataGridView Обновление связанных таблиц в DataGridView Обновление связанных таблиц в datagridview Отображение полей связанных таблиц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|