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

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

13.05.2021, 14:29. Показов 5710. Ответов 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
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
14.05.2021, 07:30
Студворк — интернет-сервис помощи студентам
Создание расписания чтоль? Генетический алгоритм?
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
14.05.2021, 08:59
Цитата Сообщение от Usaga Посмотреть сообщение
Какие категоричные заявления пошли)
Это не заявления, это объективный факт. Даже по этому треду видно - простое и естественное условие для pg задаётся парой строк, в то время как для того же ms никто ничего показать не смог.
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
14.05.2021, 10:36
... а если доцент Первозванный залогинился, но отошел налить чашку кофе, а в это время ассистент Молодаядаранняя успела перехватить пару - индекс поможет?
0
Эксперт .NET
 Аватар для Usaga
14302 / 9387 / 1353
Регистрация: 21.01.2016
Сообщений: 35,392
14.05.2021, 11:31
mashmed135, не объективный это факт, а просто мнение ваше личное. Точно так же индекс и в MS SQL навешивается и в MySQL и в Firebird.

А что объективно так это то, что ТС, судя по всему, ни в зуб ногой, чтобы вообще хоть какой-то совет понять. Но выкладывать ему примеры для Postgres, когда он работает с MS SQL Server это, конечно, вообще классное решение.
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
14.05.2021, 11:43
Цитата Сообщение от Usaga Посмотреть сообщение
Точно так же индекс и в MS SQL навешивается и в MySQL и в Firebird
Нет, очевидно. Иначе почему ни вы, ни кто-либо ещё этого не сделали? А ответ один - ничего там не навешивается. Точнее, навешивается, но не индекс, а портянка которую даже писать лень.
Цитата Сообщение от Usaga Посмотреть сообщение
А что объективно так это то, что ТС, судя по всему, ни в зуб ногой, чтобы вообще хоть какой-то совет понять.
Ну это мало кого интересует, да и сам ТС мне не интересен в силу тех же причин.
Цитата Сообщение от Usaga Посмотреть сообщение
Но выкладывать ему примеры для Postgres, когда он работает с MS SQL Server это, конечно, вообще классное решение.
Это единственное адекватное и действительно классное решение. Тот факт, что ТС ничего не знает и не может оправданием не является, очевидно. Как и то, что вам и некоторым другим людям хозяин не дал выбора и вы вынуждены работать с ms.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
14.05.2021, 11:45  [ТС]
Usaga, В том то и дело, что не могу. Я за этим запросом и пришёл
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
14.05.2021, 12:13
danhiroman, Вы так и не ответили на вопрос, через какие инструменты Вы работаете с базой.
Вы код можете свой привести ?
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
14.05.2021, 12:19  [ТС]
MsGuns, Добавляю данные в базу, изменяю их и удаляю с помощью LINQ2SQL
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
14.05.2021, 12:24
Цитата Сообщение от danhiroman Посмотреть сообщение
MsGuns, Добавляю данные в базу, изменяю их и удаляю с помощью LINQ2SQL
Где код, в последний раз спрашиваю ?
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
14.05.2021, 12:26  [ТС]
MsGuns, Вот пример добавления записи в БД.
C#
1
2
3
4
5
6
7
8
9
10
11
12
            int number = findFreeID();
            DataContext db = new DataContext(connectionString);
            if (cmbGroup.SelectedValue != null && cmbDiscipline.SelectedValue != null && cmbPara.SelectedValue != null && cmbOffice.SelectedValue != null && cmbDay.Text.Length > 0)
            {
                if (OfficeIsFree())
                {
                    Raspisanie raspisanie1 = new Raspisanie { Id = number, IdDiscipline = Convert.ToInt32(cmbDiscipline.SelectedValue), IdOffice = Convert.ToInt32(cmbOffice.SelectedValue), IdPara = Convert.ToInt32(cmbPara.SelectedValue), DayWeek = Convert.ToInt32(cmbDay.SelectedValue) }; // объект для добавления в БД
                    db.GetTable<Raspisanie>().InsertOnSubmit(raspisanie1);
                    db.SubmitChanges();
                    UpdateDGV();
                }
            }
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
14.05.2021, 12:48
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
// Проверка на существование дубликатов в критичных полях Raspisanie
if (db.Raspisanie().Where({здесь выражение выборки по условиям}).FirstOrDefault() != null)
{
   MessageBox.Show("В базе уже назначена пара");
   return false;
}
Raspisanie raspisanie1 = new Raspisanie { Id = number, IdDiscipline = Convert.ToInt32(cmbDiscipline.SelectedValue)
               , IdOffice = Convert.ToInt32(cmbOffice.SelectedValue)
               , IdPara = Convert.ToInt32(cmbPara.SelectedValue)
               , DayWeek = Convert.ToInt32(cmbDay.SelectedValue) }; // объект для добавления в БД
db.GetTable<Raspisanie>().InsertOnSubmit(raspisanie1);
 db.SubmitChanges();
 UpdateDGV();
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
14.05.2021, 13:16  [ТС]
MsGuns, Это всё конечно хорошо. Но проблема собственно заключается в написание выражения для выборки. Информация о группах и учителе не содержится напрямую в Raspisanie. Там содержится только поле id_discipline, которое вводит пользователь и в котором как раз хранятся id_teacher и id_group. Получается что мне нужно. Мне надо получить значения id_teacher и id_group на основе выбранной пользователем дисциплины из Combobox, и потом сравнить их с теми полями в БД (при этом при сравнении нужно постоянно, получать из id_discipline значения соответствующих id_group и id_teacher.), в которых id_day и id_para совпадают с введёнными в соответствующих combobox. Но как это записать программно я незнаю.
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,553
Записей в блоге: 4
14.05.2021, 13:58
Цитата Сообщение от danhiroman Посмотреть сообщение
Информация о группах и учителе не содержится напрямую в Raspisanie.
Сделайте VIEW на сервере на основе нужных таблиц и по нему проверяйте.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
14.05.2021, 14:27
Цитата Сообщение от danhiroman Посмотреть сообщение
проблема собственно заключается в написание выражения для выборки. Информация о группах и учителе не содержится напрямую в Raspisanie. Там содержится только поле id_discipline, которое вводит пользователь и в котором как раз хранятся id_teacher и id_group. Получается что мне нужно. Мне надо получить значения id_teacher и id_group на основе выбранной пользователем дисциплины из Combobox, и потом сравнить их с теми полями в БД (при этом при сравнении нужно постоянно, получать из id_discipline значения соответствующих id_group и id_teacher.), в которых id_day и id_para совпадают с введёнными в соответствующих combobox. Но как это записать программно я незнаю.
И что Вам мешает добавить в Модель новый класс, содержащий "расшифрованную" информацию о всем, что Вам нужно, а потом через Linq запросом с join-ми выбирать данные с условиями, заданными комбобоксами и текстбоксами ? И вместо Raspisanie подставить в выражение if выборку из этой новой модели ?

Добавлено через 4 минуты
И еще одно. Если учителя и группу Вы выбираете из списков (ComboBox), то не надо никакой новой модели, просто добавьте в комбобоксы кроме отображаемых строк еще и Value, куда и заносите айдишники. Их-то и извлекайте для подстановки в запрос на выборку для проверки.

Добавлено через 34 секунды
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Сделайте VIEW на сервере на основе нужных таблиц и по нему проверяйте.
Из пушки по воробьям

Добавлено через 5 минут
danhiroman, Перечитал внимательно еще раз [32].
Возникли некоторые мысли:
Цитата Сообщение от danhiroman Посмотреть сообщение
Информация о группах и учителе не содержится напрямую в Raspisanie
Очень странное "расписание", не находите ?
Цитата Сообщение от MsGuns Посмотреть сообщение
Там содержится только поле id_discipline, которое вводит пользователь и в котором как раз хранятся id_teacher и id_group
Т.е. у Вас дисциплина жестко привязана к учителю и группе ? А если история читается тремя разными учителями 20 разным группам, как тогда ?
Цитата Сообщение от danhiroman Посмотреть сообщение
Мне надо получить значения id_teacher и id_group на основе выбранной пользователем дисциплины
Связанный запрос + новая модель, которую этот запрос извлекает из нескольких связанных таблиц.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
14.05.2021, 14:40  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Т.е. у Вас дисциплина жестко привязана к учителю и группе ? А если история читается тремя разными учителями 20 разным группам, как тогда ?
По поводу этого. У меня есть 2 таблицы. Одна просто таблица дисциплин всех, и потом ещё таблица дисциплин специально для группы. Тоесть там может быть такое, что например историю ведет 3 учителя и история преподается разным группа. Просто каждый будет иметь отдельную запись в discipline_academic
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,553
Записей в блоге: 4
14.05.2021, 14:44
Цитата Сообщение от MsGuns Посмотреть сообщение
Из пушки по воробьям
А зачем на клиенте городить кучу джоинов, когда на сервере запустил представление (по сути просто запрос, который и отработает быстрее, чем джоины в ORM), по нему проверил что надо и на клиенте уже записал необходимое
Ну и конечно под это представление сделать модель в клиенте.
А так проверки можно делать по разному, один из вариантов с MERGE и временной таблицей. Передаем новые данные во времянку, с помощью MERGE проводим все проверки и выполняем что надо из условия, либо отклоняем добавление, либо переписываем, либо удаляем Ну и в клиенте ловим эксепшены, которые генерируем в хранимке с MERGE.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
14.05.2021, 17:47  [ТС]
MsGuns, Спасибо за помощь и потраченное время. Вроде бы получилось сделать проверку.
0
Эксперт .NET
 Аватар для Usaga
14302 / 9387 / 1353
Регистрация: 21.01.2016
Сообщений: 35,392
18.05.2021, 09:10
Цитата Сообщение от mashmed135 Посмотреть сообщение
Нет, очевидно. Иначе почему ни вы, ни кто-либо ещё этого не сделали? А ответ один - ничего там не навешивается. Точнее, навешивается, но не индекс, а портянка которую даже писать лень.
Я не стал ничего советовать потому, что уже надоело такие вещи советовать. А MsGuns в первом же посте про индекс уникальный сказал.

Цитата Сообщение от mashmed135 Посмотреть сообщение
Это единственное адекватное и действительно классное решение.
Адекватное решение - посоветовать сменить СУБД?
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
18.05.2021, 09:59
Цитата Сообщение от Usaga Посмотреть сообщение
уже надоело такие вещи советовать
Это всего лишь оправдания. Я уже сообщал - индекс в ms не навешивается.
Цитата Сообщение от Usaga Посмотреть сообщение
А MsGuns в первом же посте про индекс уникальный сказал
Я уже отвечал на это - говорить его не просили, просили показать. Зачем ты пишешь про "сказал" когда речь о другом?

Кстати, выше он привёл код, в котором ошибся именно так, как я и сказал. Смотри sql в базу от этого кода, если интересно. Не поймёшь - пасти полную транзакцию сюда, попробую объяснить.
Цитата Сообщение от Usaga Посмотреть сообщение
Адекватное решение - посоветовать сменить СУБД?
Во первых, никакой смены СУБД здесь нет, есть выбор СУБД, поскольку ничего не готово. Во вторых, если уж не повезло выбрать сразу нормально, заменить большой проблемы не представляет.
0
18.05.2021, 13:47

Не по теме:

Цитата Сообщение от mashmed135 Посмотреть сообщение
Я уже сообщал - индекс в ms не навешивается.
Эх, жаль, что вас так рано забанили и вы не успели рассказать про это подробнее

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2021, 13:47
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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