|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
||||||
Сохранить данные из ListView в базу SQL без дубликатов03.01.2020, 13:02. Показов 4050. Ответов 35
Метки нет (Все метки)
Добрый день Всем!
С новым годом) Есть прибор который отмечает приход и уход сотрудников компании ZKTeco. У меня есть SDK с которой я работаю для создании приложения. Так вот, на форме есть ЛистБокс - Кнопка Инпорт - Кнопка Сохранить. При Клик на Инпорт - То вся информация из Аппарата отображается в ЛистБоксе. Далее нажимаю на сохранить, и данные попадают в Базу Данных. Проблема в том что когда я повторно делаю Импорт в Листбокс и появляются новые записи, они снова записываются в Базу и получаются дубликаты. Вот код кнопки сохранить.
System.Data.SqlClient.SqlException: 'Violation of PRIMARY KEY constraint 'PK_DBName'. Cannot insert duplicate key in object 'dbo.DBName'. The duplicate key value is (1). Прикрепляю скриншот Вида из программы и структуру базы
0
|
||||||
| 03.01.2020, 13:02 | |
|
Ответы с готовыми решениями:
35
Добавить из DataGrid в SQL без дубликатов Как можно сохранить данные из ListView в Txt или Access, чтоб после закрытия формы данные остались Сохранить Listview в SQL |
|
Модератор
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
|
|
| 08.01.2020, 04:45 | |
|
Uswer, Разбор записей на стороне ПО будет выполняться дольше, чем SQL, а вот по поводу ошибок при добавлении - да, ТС наступает на те же грабли с каждым новым постом...
Во-вторых, у него, плюс ко всему UNIQUE INDEX настроен только на столбец "No", а должен был на другие, с тем учетом, что столбец No и так сам по себе должен быть. Вот только не понятно, этот порядковый номер присваивается Девайсом и читается с него в ПО, или же присваивается самим ПО для каждой записи? И почему он уже имеет дубликаты то?
1
|
|
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
||
| 08.01.2020, 09:29 [ТС] | ||
|
Я думаю сделать чтобы при выгрузки из Девайса, автоматически удалялись все записи из Девайса. тогда будет всегда первая запись под номерам 1 Тогда на что нужно делать UNIQUE INDEX? на Дату и время ? она в формате 2018-31-01 08:00:31
0
|
||
|
Модератор
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
|
|
| 08.01.2020, 09:39 | |
|
Fanka313, вам в таком случае вообще не стоит эти порядковые номера добавлять в грид и тем более выгружать их в базу, отсюда у вас плодятся дубликаты.
База Данных должна имень поле с АвтоИнкрементом и присваивать свои уникальные номера для каждой записи. UI нужно настроить на все остальные поля строки, чтобы они были уникальны в базе
0
|
|
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
||
| 08.01.2020, 09:56 [ТС] | ||
|
У каждого сотрудника есть свой номер - каждый день у всех сотрудников будет 2 записи (утром пришел вечером ушел) Соответственно номера сотрудников могут повторятся - единственное что разное в этой Грид это Даты и Время. Возможно и такое что есть 2 разных Девайса. Тогда нужно делать UI проверку на 2 полей, ЧТобы номер сотрудника и Дата и Время были уникальны ? так как один и тотже сотрудник может утром отметится на одном Девайсе а вечером на другом. Вот время будет Разное. Так правильно будет ?
0
|
||
|
Модератор
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
|
|
| 08.01.2020, 10:15 | |
|
Fanka313, Все правильно и на время и на ID сотрудника нужно настраивать UI.
Если толь на дату и время, то может быть такое, что в разных девайсах в одно и то же время отметятся два разных человека, и один из них не добавится в базу, так как дубликат по времени будет. А если ID и Время в UI, то только по этим двум полям будет фильтр дублей, а не только по времени. Добавлено через 2 минуты и да, разберитесь с порядковыми номерами записей, настройте базу на автоинкремент самой базой, и в запрос на INSERT - не указывайте этот номер, т.к. база сама присвоит уникальный номер для записи
0
|
|
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
|||||||
| 08.01.2020, 10:26 [ТС] | |||||||
|
Подскажите как правильней сделать это:
0
|
|||||||
|
Модератор
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
|
||||||
| 08.01.2020, 11:10 | ||||||
|
Fanka313, незнаю как в MSSQL, но вроде нужно в скобках, через запятую, перечислить имена столбцов
Добавлено через 2 минуты и да, все предыдущие UNIQUE INDEX нужно будет удалить и оставить только один в базе, тот, что составлен будет под ваши нужды, иначе будут накладки и ложные срабатывания Добавлено через 58 секунд прописав его один раз в базе, не нужно его вызывать каждый раз... Эта настройка будет храниться в базе и использоваться ей при запросах, самостоятельно
0
|
||||||
|
2674 / 1824 / 176
Регистрация: 25.07.2015
Сообщений: 2,957
|
|||
| 09.01.2020, 09:08 | |||
|
Мне, к слову, не очень понятно (возможно из-за отсутствия полной картины) зачем индексировать поле No. Это просто порядковый номер операции, на который наложен PrimaryKey и автоматом все индексы и ограничения. Я бы , исходя из задачи, проиндексировал без признака уникальности поля EmpID и InOut. Последний не обязательно. Кстати, любопытно что за состояние 2 в поле InOut на скриншоте . ПО логике там должно быть два состояния - True/False (1/0) 2 - это завис в турникете ? )))
1
|
|||
| 09.01.2020, 10:50 | |
|
Kulma, говоря о PrimaryKey я имел ввиду основную индексную колонку в БД (в моём примере это "ID"), к которой Fanka313 приравнивает колонку "№" в программе. Но на деле они между собой не должны быть связаны. Т.е. ТС пихает в запрос "№" вместо "No", а это не одно и тоже. В базе этот "№" вообще не нужен.
0
|
|
|
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 843
|
|
| 09.01.2020, 11:09 | |
|
Не проще ли просто делать полную перезапись в БД. Только перед перезаписью сделать копию таблицы БД, очистьть от данных таблицу БД, записать туда данные по новому,а после записи всех данных по новому копию очистить или удалить.
0
|
|
|
Модератор
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
|
|
| 09.01.2020, 12:06 | |
|
andrsh, нет, так не будет проще. По той причине, что удалив данные из базы вы навсегда их потеряете, т.к. в приборе тоже эти данные могут быть удалены.
Добавлено через 1 минуту Kulma, Да я помню, просто, если ТС не может составить, точнее не совсем понимает как правильно, указать UNIQUE INDEX по нескольким колонкам, то такой сложный запрос, как рекурсия - тяжело пойдет...
0
|
|
|
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 843
|
|
| 09.01.2020, 12:40 | |
|
Yury Komar, Удалять полностью данные из бд сразу не надо. Сначала делаются резервные данные. Удалять резервные данные только после перезаписи данных из прибора. Если же в приборе записи будут утеряны то делать копию таблицы не надо, а просто дописать новые.
0
|
|
|
Модератор
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
|
|
| 09.01.2020, 12:48 | |
|
andrsh, Да не, так никто не делает, по-моему. Правильней будет проверять на уникальность перед записью в базу
0
|
|
|
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 843
|
|
| 09.01.2020, 12:53 | |
|
Я понимаю что может быть так никто не делает, как бы не принято. Но в принципе это как выход из положения. Или сверять все строки из БД с записями из прибора. Только наверное надо сверять каждую строчку полностью, чтобы в о всех ячейках были одинаковые записи и потом удалять копии. Как говорится пути господни неисповедимы. Одну и ту же задачу можно решить по разному.
0
|
|
| 09.01.2020, 14:20 | ||
Сообщение было отмечено Kulma как решение
РешениеДавайте проанализируем алгоритм ТСа: 1. Построчная Выборка данных из контроллера, с распихиванием в DataGridView, по сути в таблицу. 2. Построчная Запись в БД: 2.а. построение SQL-запроса для текущей строки DataGridView; 2.б. выполнение запроса, в котором SQL-сервер будет шерстить всю таблицу в БД при проверке уникальности. А теперь тот вариант, который предложил я: 1. Построчная Выборка данных из контроллера, с разбором, т.е. записью данных в локальную таблицу только действительно нужных записей. Причём разбор сокращённый, т.к. мы НЕ проверяем большое кол-во записей, а делаем всего лишь проверку по дате текущей и последней записанной строк. При этом локальная таблица привязана к DataGridView для отображения. 2. Обновление данных в БД одной командой. Как оптимизирован и оптимизирован ли вообще метод Update() мне не ведомо. А теперь сравним всё это. 1) п.1 в обоих вариантах практически идентичны, за исключением "сокращённого разбора" (сравнения) в моём варианте. 2) При обновлении через SQL-запрос выполнение п.2 будет тем дольше, чем больше записей в результирующей таблице. Уже через год там поднаберётся уйма записей. При обновлении через адаптер п.2 займёт только время необходимое для записи данных в БД (без каких либо дополнительных проверок, рекурсий и прочего). В идеале это время никак не связано с объёмом хранимой информации в БД. Не уверен я, что алгоритм ТСа всегда окажется быстрее! Ну и как я уже отмечал, вариант с разбором записей на стороне ПО не зависим от типа SQL-сервера.
0
|
||
|
Модератор
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
|
|
| 09.01.2020, 15:15 | |
|
Uswer, честно говоря, я не настаиваю на том или ином варианте решения задачи, я просто делюсь советом. А ТС уже сам(а) пускай выбирает подходящий ей вариант.
0
|
|
| 09.01.2020, 15:15 | |
|
Скопировать все данные пользователя из БД другому пользователю без дубликатов
Как сохранить данные в базу Не могу сохранить данные в базу Как сохранить ссылки на рисунки в sql и затем отобразить их в listview Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера 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, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|