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

Как сделать проверку на добавление записи в БД

13.05.2021, 14:29. Показов 5712. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть таблица расписание (raspisanie) куда я добавляю запись о каком-либо занятий группы. И мне нужно как-то сделать проверку на то, чтобы один преподаватель не мог вести в одинаковое время 2 пары. И ещё, чтобы нельзя было добавлять занятие для группы, если например у этой группы уже есть занятие в это время. Время получается из (id_day(это день недели) и id_para(это время пары)). Преподаватель может преподавать несколько дисциплин, и он указан в таблице discipline_academic как id_teacher. Помогите пожалуйста.
Миниатюры
Как сделать проверку на добавление записи в БД  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.05.2021, 14:29
Ответы с готовыми решениями:

Как сделать проверку на свободное время для записи в Yii2?
разрабатываю систему для записи съемок , хотелось бы узнать как проверять на свободное время человека для записи, день и время, (аналогия...

Как сделать добавление записи через ADOTable?
Как осуществить добавление записи через ADOTable, чтобы он был в новой форме и там 6 столбцов

Сделать проверку на добавление данных в listbox
На форме listbox, текстовое поле, кнопка по кнопке в listbox добавляется тест, введенный в текстовое поле: ...

42
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
13.05.2021, 16:06
Тут несколько решений.
1. Создание на сервере для таблицы уникальных индексов.
2. Алгоритм модификации/добавления вложить в бизнес-логику сервера на уровне хранимой процедуры или триггера.

В обоих случаях ловить с клиента (Вашего приложения) эксепшины сервера в коде создания и отсылки запросов на изменение/добавление

3. В самом приложении перед модификацией/добавлением записи посылать запрос на выборку записи с такими же значениями критичных полей и, если найдена, то ругаться и ничего не изменять/добавлять. Тут небольшая хитрость: и проверку, и запись в БД если проверка была успешной (нет записи с "дублированием") нужно отсылать на сервер в одной транзакции.

Добавлено через 5 минут
И Вы не написали самого главного - каким образом Вы реализуете отправку на сервер новых/измененных записей.
Если через адаптер (т.е. изменения делаются в гриде), то все грустно. Ибо Вам придется при выборе метода 3 (а что-то мне подсказывает, что ни триггеры, ни уникальные индексы Вы писать не будете) накручивать логику по событиям датасета грида ибо, насколько я знаю, штатные методы адаптера (Update, Insert) не позволяют вместо запросов писать целые скрипты, в который еще и поднимаются на сервере исключения.
1
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
13.05.2021, 16:24  [ТС]
MsGuns, Ничего не понял, но очень интересно
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
13.05.2021, 16:49
Цитата Сообщение от MsGuns Посмотреть сообщение
Тут небольшая хитрость: и проверку, и запись в БД если проверка была успешной (нет записи с "дублированием") нужно отсылать на сервер в одной транзакции.
..да вовсе и не обязательно .. это же валидация фактически ... проверили наличие, преподавателю мессаж "Ваша пара/аудитория/группа уже занята ..." ... Куда торопиться-то ..?
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.05.2021, 17:31
Цитата Сообщение от MsGuns Посмотреть сообщение
В самом приложении перед модификацией/добавлением записи посылать запрос на выборку записи с такими же значениями критичных полей и, если найдена, то ругаться и ничего не изменять/добавлять. Тут небольшая хитрость: и проверку, и запись в БД если проверка была успешной (нет записи с "дублированием") нужно отсылать на сервер в одной транзакции.
Поможет только при транзакциях на serializable, остальное точно так же пропустит невалидные данные.
Цитата Сообщение от MsGuns Посмотреть сообщение
Алгоритм модификации/добавления вложить в бизнес-логику сервера на уровне хранимой процедуры или триггера.
Та же проблема. 90% написать такую проверку не смогут.
Цитата Сообщение от carrotik Посмотреть сообщение
..да вовсе и не обязательно .. это же валидация фактически ... проверили наличие, преподавателю мессаж "Ваша пара/аудитория/группа уже занята ..." ... Куда торопиться-то ..?
Да, если к базе всегда не более одного клиента доступ имеет(справедливо для 90% приложений, поделка тс попадёт в эту категорию с вероятностью 100%).
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
13.05.2021, 17:41
mashmed135, Это все хорошо, но где Ваши рекомендации, как решить эту проблему при условии, что приложение сооружалось на 90% в конструкторе и с редактируемым гридом ?
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.05.2021, 17:53
Цитата Сообщение от MsGuns Посмотреть сообщение
но где Ваши рекомендации
Индекс. Ценителям можно предложить триггер. Совсем извращенцам - тот же триггер, только в приложении и запускаемый соответственно не базой, а приложением. Всё.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
13.05.2021, 18:21  [ТС]
Ребят, а что делать то в итоге? Может кто максимально для тупых объяснить, как действовать.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
13.05.2021, 18:23
Цитата Сообщение от mashmed135 Посмотреть сообщение
Индекс. Ценителям можно предложить триггер
Читаем [2] пункты 1 и 2.
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.05.2021, 18:25
Цитата Сообщение от danhiroman Посмотреть сообщение
Ребят, а что делать то в итоге?
Индекс делать.
SQL
1
2
3
4
5
6
7
8
9
CREATE EXTENSION BTREE_GIST;
CREATE TABLE TEST (
  ID BIGINT PRIMARY KEY,
  PREPOD_ID BIGINT NOT NULL,
  BEGIN_TIME TIMESTAMP NOT NULL,
  END_TIME TIMESTAMP NOT NULL,
 
  EXCLUDE USING GIST (PREPOD_ID WITH =, (TSRANGE(BEGIN_TIME, END_TIME)) WITH &&)
);
Второе ограничение сам добавь.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
13.05.2021, 18:29
Цитата Сообщение от danhiroman Посмотреть сообщение
Ребят, а что делать то в итоге?
А тут 2 варианта.
1. Ничего не делать, бросить программирование нафиг. А пойти, например, в сапожники или пирожники.
2. Набраться терпения и начать изучать что-нибудь кроме "методичек" Ваших "преподов".

Добавлено через 3 минуты
Цитата Сообщение от mashmed135 Посмотреть сообщение
Индекс делать.
А с чего Вы взяли, что у ТС PostgreSQL ?
1
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
13.05.2021, 18:29  [ТС]
mashmed135, Можно комментарии к этому? Что это делает и куда его пихать непосредственно в приложении на С#?
SQL
1
2
3
4
5
6
7
8
9
CREATE EXTENSION BTREE_GIST;
CREATE TABLE TEST (
  ID BIGINT PRIMARY KEY,
  PREPOD_ID BIGINT NOT NULL,
  BEGIN_TIME TIMESTAMP NOT NULL,
  END_TIME TIMESTAMP NOT NULL,
 
  EXCLUDE USING GIST (PREPOD_ID WITH =, (TSRANGE(BEGIN_TIME, END_TIME)) WITH &&)
);
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.05.2021, 18:29
Цитата Сообщение от MsGuns Посмотреть сообщение
Читаем [2] пункты 1 и 2
Нет, все твои пункты - 90% дырявые, как я уже говорил. Попробуешь реализовать и осознаешь. Ничего лучше индекса здесь нет.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
13.05.2021, 18:31
Цитата Сообщение от mashmed135 Посмотреть сообщение
Ничего лучше индекса здесь нет.
Круто !

Добавлено через 45 секунд
danhiroman, О Вам чушь предложил, к тому же для постргеса,У Вас же сервер другой ?
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.05.2021, 18:32
Цитата Сообщение от danhiroman Посмотреть сообщение
Что это делает
Запрещает вести преподу более одной пары одновременно.
Цитата Сообщение от danhiroman Посмотреть сообщение
и куда его пихать непосредственно в приложении на С#?
В базу. Но в целом, с этим не ко мне - основу решения я тебе сказал, а где ты его применять будешь мне не интересно.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
13.05.2021, 18:32  [ТС]
MsGuns, MS SQL server
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.05.2021, 18:35
Цитата Сообщение от MsGuns Посмотреть сообщение
А с чего Вы взяли, что у ТС PostgreSQL ?
Потому как ничего другого вменяемого в области реляционок нет.
Цитата Сообщение от MsGuns Посмотреть сообщение
Круто !
Да. Но ты можешь попробовать предложить хотя бы работающее решение. Впрочем, ты не сможешь. выше я уже говорил об этом.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
13.05.2021, 18:42
Цитата Сообщение от danhiroman Посмотреть сообщение
MsGuns, MS SQL server
Вот и я о том же. Поэтому "советы" mashmed135 можете смело пропускать.

Идея же ограничения (CONSTRAINT) на проверку уникальности значений совокупности полей таблицы, дополняющее правила бизнес-логики любого SQL-сервера, высказанная в [2] п.1, реализуется в MS SQL несколько по-другому. Как - читайте в документации мелкомягких.

Все правила БЛС (бизнес-логики сервера) действуют абсолютно независимо от приложений, которые с ним (сервером) работают. Т.е. ни студия, ни шарп к этому отношения не имеют. Если, конечно, сами они не создают БД (EF Code First например)

Добавлено через 1 минуту
Цитата Сообщение от mashmed135 Посмотреть сообщение
Потому как ничего другого вменяемого в области реляционок нет.

Не по теме:

Все с тобою понятно :)

0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.05.2021, 18:49
Цитата Сообщение от MsGuns Посмотреть сообщение
реализуется в MS SQL несколько по-другому. Как - читайте в документации мелкомягких.
Ну вот, всё как я и говорил - очередной эксперт кинул пару лозунгов, обосновать ни один из них не смог и начал кивать в сторону гугла/документации/авторитетов.

Так же видно, что дошколёнок уже выдрессированный - сразу понял, что против меня шансов у него никаких и даже не пытался родить хоть какое-то решение, ограничившись перепастой прочитанного в интернете ранее. Забавно на ятом фоне смотрятся пассажи про "ясно".

Скучно.
0
Эксперт .NET
 Аватар для Usaga
14303 / 9388 / 1354
Регистрация: 21.01.2016
Сообщений: 35,392
14.05.2021, 05:53
Цитата Сообщение от mashmed135 Посмотреть сообщение
Потому как ничего другого вменяемого в области реляционок нет.
Вау) Какие категоричные заявления пошли)

danhiroman, тут народ спорит о корректном решении в условиях конкурентного доступа к базе. А вы хотя бы банальный запрос на SQL написать можете? Чтобы хотя бы просто проверить наличие пары на определённую дату с определённым преподом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2021, 05:53
Помогаю со студенческими работами здесь

Подскажите как сделать форму добавление записи в DBGrid
Привет, проблема такая: есть DBGrid, и есть кнопка "Добавить" если ее нажать должна появится форма с Label-амы и Edit-амы их должно...

Как сделать добавление/редактирование/удаление записи в dbgrid?
подскажите, пожалуйста, как сделать добавление/редактирование/удаление записи в dbgrid? проект и базу прикрепляю. и еще такой...

Как сделать добавление записи через запрос в Access
Нужно сделать добавление записи в datagridview через запрос , через отдельную форму, не получается. проект ниже

Как сделать проверку на пустую строку и проверку что в слове нет повторяющихся букв
string r; string word; int output; Console.Write("Введите слово : "); ...

Как добавлять записи в файл, делая проверку на пустые записи
k = 0 'Ñ÷åò÷èê ïócòûõ çàïèñåé For x = 0 To 7 If Text1(x).Text = "" Then Shape1(x).Visible = True k = k + 1 ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru