Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32

Сохранить данные из ListView в базу SQL без дубликатов

03.01.2020, 13:02. Показов 4050. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день Всем!
С новым годом)

Есть прибор который отмечает приход и уход сотрудников компании ZKTeco.
У меня есть SDK с которой я работаю для создании приложения.

Так вот, на форме есть ЛистБокс - Кнопка Инпорт - Кнопка Сохранить.

При Клик на Инпорт - То вся информация из Аппарата отображается в ЛистБоксе.
Далее нажимаю на сохранить, и данные попадают в Базу Данных.
Проблема в том что когда я повторно делаю Импорт в Листбокс и появляются новые записи, они снова записываются в Базу и получаются дубликаты.

Вот код кнопки сохранить.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Dim iCount As Integer
        Dim iLoop As Integer
        Dim query3 As New SqlCommand
        Dim lvitem
        query3.Connection = New SqlConnection("Server= '" & TextBox1.Text & "' ; Database = DBName; Integrated Security = true")
        query3.Connection.Open()
 
        iCount = lvLogs.Items.Count
        ' For iLoop = 0 To lvLogs.Items.Count - 1
        If Not lvLogs.Items.Count = 0 Then
            Do Until iLoop = lvLogs.Items.Count
 
                lvitem = lvLogs.Items.Item(iLoop)
 
                With lvitem
 
                    query3.CommandText = "insert into DataLog values ('" & lvitem.subitems(0).text & "','" & lvitem.subitems(1).text & "','" & lvitem.subitems(2).Text & "','" & lvitem.subitems(3).Text & "','" & lvitem.subitems(4).Text & "','" & lvitem.subitems(5).Text & "') "
 
                    query3.ExecuteNonQuery()
                End With
 
                iLoop = iLoop + 1
                lvitem = Nothing
            Loop
            MsgBox("done")
        End If
Если ставить Primary Key то получаю ошибку
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).


Прикрепляю скриншот Вида из программы и структуру базы
Миниатюры
Сохранить данные из ListView в базу SQL без дубликатов  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2020, 13:02
Ответы с готовыми решениями:

Добавить из DataGrid в SQL без дубликатов
Добрый день всем, возник вопрос: Sub connectsql() connsql = New SqlConnection("Server= '" &...

Как можно сохранить данные из ListView в Txt или Access, чтоб после закрытия формы данные остались

Сохранить Listview в SQL
Добрый день всем ! Пытаюсь сохранить данные из ListView в SQL базу данных вот код который сейчас у меня есть Try ...

35
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
08.01.2020, 04:45
Студворк — интернет-сервис помощи студентам
Uswer, Разбор записей на стороне ПО будет выполняться дольше, чем SQL, а вот по поводу ошибок при добавлении - да, ТС наступает на те же грабли с каждым новым постом...
Во-вторых, у него, плюс ко всему UNIQUE INDEX настроен только на столбец "No", а должен был на другие, с тем учетом, что столбец No и так сам по себе должен быть.

Вот только не понятно, этот порядковый номер присваивается Девайсом и читается с него в ПО, или же присваивается самим ПО для каждой записи? И почему он уже имеет дубликаты то?
1
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
08.01.2020, 09:29  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
этот порядковый номер присваивается Девайсом и читается с него в ПО, или же присваивается самим ПО для каждой записи?
Этот порядковый номер присвоен Девайсом, то есть к примеру там 60 записей, при выгрузки они будут под номерами от 1 до 60 если добавиться запись то уже будет 61, в случае если очистить все записи из девайса то снова записи новые будут под номерам от 1 до ...

Я думаю сделать чтобы при выгрузки из Девайса, автоматически удалялись все записи из Девайса.
тогда будет всегда первая запись под номерам 1

Тогда на что нужно делать UNIQUE INDEX? на Дату и время ? она в формате 2018-31-01 08:00:31
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
08.01.2020, 09:39
Fanka313, вам в таком случае вообще не стоит эти порядковые номера добавлять в грид и тем более выгружать их в базу, отсюда у вас плодятся дубликаты.
База Данных должна имень поле с АвтоИнкрементом и присваивать свои уникальные номера для каждой записи.

UI нужно настроить на все остальные поля строки, чтобы они были уникальны в базе
0
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
08.01.2020, 09:56  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
UI нужно настроить на все остальные поля строки, чтобы они были уникальны в базе
На все поля ?
У каждого сотрудника есть свой номер - каждый день у всех сотрудников будет 2 записи (утром пришел вечером ушел)
Соответственно номера сотрудников могут повторятся - единственное что разное в этой Грид это Даты и Время.


Возможно и такое что есть 2 разных Девайса. Тогда нужно делать UI проверку на 2 полей, ЧТобы номер сотрудника и Дата и Время были уникальны ? так как один и тотже сотрудник может утром отметится на одном Девайсе а вечером на другом. Вот время будет Разное.

Так правильно будет ?
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
08.01.2020, 10:15
Fanka313, Все правильно и на время и на ID сотрудника нужно настраивать UI.
Если толь на дату и время, то может быть такое, что в разных девайсах в одно и то же время отметятся два разных человека, и один из них не добавится в базу, так как дубликат по времени будет. А если ID и Время в UI, то только по этим двум полям будет фильтр дублей, а не только по времени.

Добавлено через 2 минуты
и да, разберитесь с порядковыми номерами записей, настройте базу на автоинкремент самой базой, и в запрос на INSERT - не указывайте этот номер, т.к. база сама присвоит уникальный номер для записи
0
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
08.01.2020, 10:26  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
Все правильно и на время и на ID сотрудника нужно настраивать UI.
Спасибо буду пробовать такой вариант

Подскажите как правильней сделать это:

SQL
1
2
3
CREATE UNIQUE INDEX uidx_pid
ON DataLog (DATE);
ON DataLog (EmpID);
или есть другая функция Query для ее создании ?
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
08.01.2020, 11:10
Fanka313, незнаю как в MSSQL, но вроде нужно в скобках, через запятую, перечислить имена столбцов
SQL
1
2
CREATE UNIQUE INDEX uidx_pid
ON DataLog (Стобец1, Столбец2);
Так же напомню, что при присутствии в базе дубликатов, будет выдано исключение, которое вам нужно обработать/пропустить на уровне вашего ПО, так как в MSSQL ннт запроса INSERT IGNORE, которое бы это делало молча, без оповещений и на уровне самой БД.

Добавлено через 2 минуты
и да, все предыдущие UNIQUE INDEX нужно будет удалить и оставить только один в базе, тот, что составлен будет под ваши нужды, иначе будут накладки и ложные срабатывания

Добавлено через 58 секунд
прописав его один раз в базе, не нужно его вызывать каждый раз... Эта настройка будет храниться в базе и использоваться ей при запросах, самостоятельно
0
2674 / 1824 / 176
Регистрация: 25.07.2015
Сообщений: 2,957
09.01.2020, 09:08
Цитата Сообщение от Uswer Посмотреть сообщение
Может я не прав, но по моему главная ошибка ТСа в том, что он упорно командует SQL-северу сделать новую запись с уже существующим PrimaryKey.
От чего же . Всё верно.
Мне, к слову, не очень понятно (возможно из-за отсутствия полной картины) зачем индексировать поле No.
Это просто порядковый номер операции, на который наложен PrimaryKey и автоматом все индексы и ограничения.
Я бы , исходя из задачи, проиндексировал без признака уникальности поля EmpID и InOut.
Последний не обязательно. Кстати, любопытно что за состояние 2 в поле InOut на скриншоте .
ПО логике там должно быть два состояния - True/False (1/0) 2 - это завис в турникете ? )))

Цитата Сообщение от Yury Komar Посмотреть сообщение
так как в MSSQL ннт запроса INSERT IGNORE, которое бы это делало молча, без оповещений и на уровне самой БД.
Юр , проверка на наличие записей в MSSQL легко производится с помощью рекурсивного запроса . Вариантов несколько.Ссылки на них я давал ранее.
1
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 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
Модератор
Эксперт .NET
 Аватар для Yury Komar
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
Модератор
Эксперт .NET
 Аватар для Yury Komar
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
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
09.01.2020, 14:20
Лучший ответ Сообщение было отмечено Kulma как решение

Решение

Цитата Сообщение от Yury Komar Посмотреть сообщение
Разбор записей на стороне ПО будет выполняться дольше, чем SQL
Так ли?

Давайте проанализируем алгоритм ТСа:
1. Построчная Выборка данных из контроллера, с распихиванием в DataGridView, по сути в таблицу.
2. Построчная Запись в БД:
2.а. построение SQL-запроса для текущей строки DataGridView;
2.б. выполнение запроса, в котором SQL-сервер будет шерстить всю таблицу в БД при проверке уникальности.

А теперь тот вариант, который предложил я:
1. Построчная Выборка данных из контроллера, с разбором, т.е. записью данных в локальную таблицу только действительно нужных записей. Причём разбор сокращённый, т.к. мы НЕ проверяем большое кол-во записей, а делаем всего лишь проверку по дате текущей и последней записанной строк. При этом локальная таблица привязана к DataGridView для отображения.
2. Обновление данных в БД одной командой. Как оптимизирован и оптимизирован ли вообще метод Update() мне не ведомо.

А теперь сравним всё это.
1) п.1 в обоих вариантах практически идентичны, за исключением "сокращённого разбора" (сравнения) в моём варианте.
2) При обновлении через SQL-запрос выполнение п.2 будет тем дольше, чем больше записей в результирующей таблице. Уже через год там поднаберётся уйма записей.
При обновлении через адаптер п.2 займёт только время необходимое для записи данных в БД (без каких либо дополнительных проверок, рекурсий и прочего). В идеале это время никак не связано с объёмом хранимой информации в БД.

Не уверен я, что алгоритм ТСа всегда окажется быстрее!
Ну и как я уже отмечал, вариант с разбором записей на стороне ПО не зависим от типа SQL-сервера.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
09.01.2020, 15:15
Uswer, честно говоря, я не настаиваю на том или ином варианте решения задачи, я просто делюсь советом. А ТС уже сам(а) пускай выбирает подходящий ей вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.01.2020, 15:15

Скопировать все данные пользователя из БД другому пользователю без дубликатов
Таблица ДАТА +-------------+---------------------+---------+ | word1| word2 | user_id | ...

Сохранить данные из ListView в текстовый файл
НА форме listview и кнопка. listview состоит из 2х столбцов как сохранить данные в текстовое поле из listview с разделителем | между...

Как сохранить данные в базу
Есть база данных книг, есть автоматически сгенерированная edm-модель, где MyHandbook - класс для описания всей базы, а autorscollection -...

Не могу сохранить данные в базу
Здравствуйте. Использую wampserver. Настроил подключение, все отображает. Проблема заключается в следующем: не могу сохранить данные...

Как сохранить ссылки на рисунки в sql и затем отобразить их в listview
Добрый день! Уважаемые господа программисты помогите решить следующую задачу. Я хочу в базе данных хранить ссылки на изображения...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru