|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
||||||
Сохранить данные из ListView в базу SQL без дубликатов03.01.2020, 13:02. Показов 3832. Ответов 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 |
| 03.01.2020, 22:49 | |
|
Для начала надо бы понять, каким образом иМпортируются данные в ListView (а не ЛистБокс), т.е. при импорте автоматические подгружаются только новые, с последнего импорта, данные или все что в памяти устройства. Если подгружаются все данные, тогда надо делать т.н. разбор, т.е. перед записью проверять, что в БД нет дубликата текущей записи. Для решения этой задачи предложу сделать таблицу, в которую данные добавляются при импорте, но только в случае если текущая запись имеет дату позднее последней записи или равной дате, но с отличными данными других полей. В этом случае запись в БД будет выполнятся из этой таблицы, эту же таблицу легче всего привязать к ListView для отображения. После записи данных в БД фиксируете состояние таблицы методом AcceptChanges().
0
|
|
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
||
| 05.01.2020, 09:54 [ТС] | ||
|
Uswer да подгружаются все записи что в памяти этого устройства.
0
|
||
| 05.01.2020, 17:00 | ||||||
|
Вот моё видение решения твоей задачи.
Внимание, весь код написан в блокноте и не проверялся в студии, поэтому возможны синтаксические и прочие ошибки!!! Также предлагаю отказаться от ListView, а применить DataGridView. В этом случае, для отображения данных, достаточно только привязать таблицу EventsTable к DataGridView.DataSource. Кликните здесь для просмотра всего текста
0
|
||||||
|
Модератор
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
|
|
| 05.01.2020, 18:13 | |
|
Вообще можно же настроить в БД UNIQUE INDEX указав какие данные в строке должны быть уникальными и при добавлении или изменении записи, при нахождении дублей в базе - будет выдано исключение, либо, использую INSERT IGNORE (вроде) такие записи будут просто игнорироваться и добавляться не будут... Очень хорошая штука и экономит кучу времени и лишнего кода на стороне ПО.
0
|
|
| 05.01.2020, 19:09 | ||
|
Вот не знаю я SQL-ля , отсюда и такие решения, да ещё и людям советую ![]() Юрий, ну где ты был раньше? Однако автору при выгрузке данных из железа все равно надо делать проверку по дате, т.к. эти данные не имеют первичного ключа, наверное. То есть INSERT IGNORE нам никак не поможет, наверное.
0
|
||
|
Модератор
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
|
|
| 05.01.2020, 19:16 | |
|
Uswer, INSERT IGNORE в связке с UNIQUE INDEX, в котором указываются колонки строк, которые должны содержать уникальные данные
Добавлено через 2 минуты я в SQL тоже не профи, просто сталкивался с такой проблемой, и эта штука ооочень помогла решить вопрос дублей в базе
0
|
|
| 05.01.2020, 19:26 | |
|
Если в UNIQUE INDEX указать колонку со временем, то тоже не годится, наверное. Так как в событиях могут быть данные с одинаковым временем, но разными данными других полей, например "EmpID". В системах контроля доступа такое не редкость, в особенности если контроллеров в системе более одного (рассинхрон времени и т.п.). Поэтому мне кажется делать разбор до записи в БД все равно придётся на стороне ПО. НО знатоки SQL-ля смогут построить запрос для решения и этого нюанса
![]() Не по теме: Вопрос плавно перетёк в проблему построения SQL-запроса, поэтому автору лучше создать новую тему в соответствующем разделе.
0
|
|
|
Модератор
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
|
|
| 05.01.2020, 19:52 | |
|
Ну рассинронизация по времени - это уже проблема оборудования, и ее нужно решать не в программе.
А по теме - ну вряд-ли человек дважды в одно и то же время отметится в одном или разных местах, следовательно, запись уже в приборе - выгружена в ПО. Далее записана в БД... Затем снова выгрузка из прибора все тех же самых занисей с теме же данными времени, и снова попытка записать в базу - бац, а там такая уже есть, тоесть идет дубль, и тут в этом плане UNIQUE INDEX поможет, я считаю. Добавлено через 19 минут и да, в UNIQUE INDEX указываются не колонкА, а колонкИ, тоесть ошибок с временем не должно быть, типа одно и то же время, но разные ID пользователей - это уже не уникальность, и поэтому такая запись добавится, как и должна.
0
|
|
|
1721 / 1524 / 165
Регистрация: 25.07.2015
Сообщений: 2,622
|
||
| 07.01.2020, 10:44 | ||
|
Всех с наступившим НГ и Рождеством !!!
Вставлю свои 5 копеек в обсуждение. В принципе заданный ТС вопрос решается на уровне SQL конкретной БД , но везде разные методы и транскрипция написания. Например INSERT IGNORE, предложенный Yury Komar есть в MySQL и PostgreSQL ,но отсутствует в MSSQL и SQLite. В последних это можно реализовать : MSSQL - с помощью проверки WHERE NOT EXISTS INSERT INTO ... или MERGE SQLite - с помощью конструкции INSERT OR IGNORE INTO, где OR - не просто оператор сравнения . Это заменитель в конструкциях INSERT и UPDATE уникальной SQLite инструкции ON CONFLICT Касаемо На момент записи в БД , таблица , куда производится запись, лочится и отзывается только на чтение. По сему одновременная запись одного и того же значения будет практически невозможна. По теме -первое , что бросается в глаза и вызывает сомнения на скриншотах ТС -это поле No Если это ключевое поле с порядковыми номерами записей , то 1) Его тип должен быть INT ,а не DECIMAL 2) Правильно будет его сделать типом IDENTITY(1,1) , если речь идёт о MSSQL . т.е. с автоматическим приращением. 3) Оно не должно использоваться запросе INSERT , т.е. lvitem.subitems(0).text (исходя из скриншотов ТС ) должно быть исключено из запроса , т.к. ошибка , судя по описанию ТС , идёт именно по этому полю, ибо других ключей я просто не вижу , исходя из того , что все остальные поля (из скриншота) допускают пустое значение. Более детально по вопросу смогу ответить после того ,как увижу структуру таблицы и ключей. Пока всё. За сим откланиваюсь. Всех ещё раз с праздником/ками !!!
2
|
||
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
|||||||||||||
| 07.01.2020, 10:56 [ТС] | |||||||||||||
System.Data.SqlClient.SqlException: Cannot insert duplicate key in object 'dbo.DataLog'. The duplicate key value is (1).
0
|
|||||||||||||
|
Модератор
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
|
|
| 07.01.2020, 11:34 | |
|
так ваш "No" - это что такое?
Добавлено через 2 минуты если индекс (порядковый номер записи) то, он, типа, не должен содержать дубликаты, а они, видимо, УЖЕ есть в базе
0
|
|
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
|||
| 07.01.2020, 12:40 [ТС] | |||
|
Создал UNIQUE INDEX. при первом иморте там 10 записей, я их сохранил в Базу, далее сделал второй импорт где уже не 10 а 20 записей, и тут ошибка такая System.Data.SqlClient.SqlException: 'Violation of PRIMARY KEY constraint 'PK_DataLog'. Cannot insert duplicate key in object 'dbo.DataLog'. The duplicate key value is (1). The statement has been terminated.'
0
|
|||
|
Модератор
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
|
|
| 07.01.2020, 12:58 | |
|
ну вот оно, UNIQUE INDEX в работе, так сказать...
А как вы добавляете, с указанием IGNORE? Иначе будет исключение на каждом дубле, что вы и наблюдаете... Я выше писал об этом
0
|
|
|
1721 / 1524 / 165
Регистрация: 25.07.2015
Сообщений: 2,622
|
|||
| 07.01.2020, 13:38 | |||
|
1
|
|||
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
|||||||||||||
| 07.01.2020, 14:54 [ТС] | |||||||||||||
DataLog = SQL Table Name Date= который не должен дублироватся
0
|
|||||||||||||
|
Модератор
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
|
|
| 07.01.2020, 15:11 | |
|
Kulma, о как... Тогда, ловить такие исключения и пропускать на уровне ПО...
0
|
|
|
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
|
||||||||
| 07.01.2020, 16:04 [ТС] | ||||||||
0
|
||||||||
|
1721 / 1524 / 165
Регистрация: 25.07.2015
Сообщений: 2,622
|
||
| 07.01.2020, 17:02 | ||
|
Вы поймите , что не важно откуда берутся данные , важно , что они дублируются в ключевом столбце. По поводу Where Not exists почитайте транскрипцию или почитайте . Так же можно использовать ( мне , к слову, больше по душе ) NOT IN Простите , но с кодом сейчас заморачиваться нет возможности - собака после операции - капельницы/уколы и т.д , мозги только на ней сосредоточены.
1
|
||
| 08.01.2020, 00:17 | |
|
Может я не прав, но по моему главная ошибка ТСа в том, что он упорно командует SQL-северу сделать новую запись с уже существующим PrimaryKey. Я об lvitem.subitems(0).text и DataGridView1.Rows(row).Cells(0).Value. Насколько я понимаю алгоритм должен быть таким: в SQL-запрос помещаете все необходимые для добавления данные кроме поля PrimaryKey, указываете какие поля участвуют в проверке уникальности записи. Сервер сделает так: проверит уникальность полей, если запись в БД с такой "уникальностью" есть, то пропустит (при условии INSERT IGNORE и аналогов для других серверов), а вот если записей в БД с такими данными не найдёт, то создаст новую запись (автоматически присвоив очередной PrimaryKey) и заполнит её данными из запроса.
Добавлено через 24 минуты И ещё, эта ..., ну раз такой зоопарк с SQL-командами, как перечислял Kulma, то может (лучше/проще) для переносимости ПО/совместимости с разными БД всё-таки разбор записей делать на стороне ПО?
0
|
|
| 08.01.2020, 00:17 | |
|
Помогаю со студенческими работами здесь
20
Скопировать все данные пользователя из БД другому пользователю без дубликатов
Как сохранить данные в базу Не могу сохранить данные в базу Как сохранить ссылки на рисунки в sql и затем отобразить их в listview Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|