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

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

03.01.2020, 13:02. Показов 3832. Ответов 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
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,731
Записей в блоге: 1
03.01.2020, 22:49
Для начала надо бы понять, каким образом иМпортируются данные в ListView (а не ЛистБокс), т.е. при импорте автоматические подгружаются только новые, с последнего импорта, данные или все что в памяти устройства. Если подгружаются все данные, тогда надо делать т.н. разбор, т.е. перед записью проверять, что в БД нет дубликата текущей записи. Для решения этой задачи предложу сделать таблицу, в которую данные добавляются при импорте, но только в случае если текущая запись имеет дату позднее последней записи или равной дате, но с отличными данными других полей. В этом случае запись в БД будет выполнятся из этой таблицы, эту же таблицу легче всего привязать к ListView для отображения. После записи данных в БД фиксируете состояние таблицы методом AcceptChanges().
0
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
05.01.2020, 09:54  [ТС]
Uswer да подгружаются все записи что в памяти этого устройства.

Для решения этой задачи предложу сделать таблицу, в которую данные добавляются при импорте, но только в случае если текущая запись имеет дату позднее последней записи или равной дате, но с отличными данными других полей. В этом случае запись в БД будет выполнятся из этой таблицы, эту же таблицу легче всего привязать к ListView для отображения. После записи данных в БД фиксируете состояние таблицы методом AcceptChanges().
Можно пример как реализовать
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,731
Записей в блоге: 1
05.01.2020, 17:00
Вот моё видение решения твоей задачи.
Внимание, весь код написан в блокноте и не проверялся в студии, поэтому возможны синтаксические и прочие ошибки!!!

Также предлагаю отказаться от ListView, а применить DataGridView. В этом случае, для отображения данных, достаточно только привязать таблицу EventsTable к DataGridView.DataSource.

Кликните здесь для просмотра всего текста
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Imports System.Data.SQLClient
 
Public Class Form1
    Dim LastRow As DataRow ' последняя добавленная строка в таблицу
    Dim EventsTable As New DataTable ' таблица для хранения событий
    Dim conn As New SqlConnection
    
    ' предполагаемая схема таблицы в базе!!!
    '("ID", ("Integer")) ' Эта колонка должна быть определена как PrimaryKey 
    '("EmpID", ("Integer"))
    '("VerifyMode", ("Integer"))
    '("InOut", ("Integer"))
    '("Date", ("DateTime")) !!!
    '("WorkCode", ("Integer"))
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim strSql As String = "SELECT TOP 1 * FROM DataLog ORDER BY ID DESC"
        Dim adapter As New SqlDataAdapter()
        
        ' необходимо заполнить TextBox1.Text !!!!!!!!!
        conn.ConnectionString = "Server= '" & TextBox1.Text & "' ; Database = DBName; Integrated Security = true"
        
        conn.Open()
        
        adapter.SelectCommand = New SqlCommand(strSql, conn)
        
        adapter.FillSchema(EventsTable, SchemaType.Mapped) ' получаем схему таблицы
        adapter.Fill(EventsTable) ' заполняем таблицу единственной строкой
        
        If EventsTable.Rows.Count > 0 Then
            LastRow = EventsTable.Rows(0)
        End If
        
        conn.Close()
    End Sub
    
    ' процедура добавления записей в таблицу
    Private Sub ImportButton_Click(sender As Object, e As EventArgs) Handles  ImportButton.Click
        Dim curRow As DataRow
        Dim i As Integer
        
        ' Здесь Mass это массив с данными из контроллера, я фиг знаю как ты их получаешь!
        For i = 0 To Mass.GetUpperBound(0)
            curRow = EventsTable.NewRow()
            curRow("EmpID") = Mass(i, 0)
            curRow("VerifyMode") = Mass(i, 1)
            curRow("InOut") = Mass(i, 2)
            curRow("Date") = Mass(i, 3)
            curRow("WorkCode") = Mass(i, 4)
 
            If CheckRow(curRow) Then
                LastRow = curRow
                EventsTable.Rows.Add(curRow)
            End If
        Next i
    End Sub
    
    ' проверяем строку подходит ли она для добавления
    Private Function CheckRow(ByVal cRow As DataRow) As Boolean
        If LastRow Is Nothing Then
            Return True
        End If
        
        Dim result As Integer = DateTime.Compare(LastRow("Date"), cRow("Date"))
      
        If result < 0 Then ' если дата последней добавленной строки меньше даты в текущей строке
            Return True
        ElseIf result = 0 Then ' если дата последней добавленной строки равна дате в текущей строке
            ' здесь должна быть проверка других полей, мне лень сам напишешь
            Return True
        Else
            Return False   
        End If
    End Function  
 
    ' сохраняем изменения в базе
    Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveButton.Click
        If conn.ConnectionString <> "" Then 
            conn.Open()
            Dim strSql As String = "select * from DataLog"
            Dim adapter As New SqlDataAdapter()
            adapter.SelectCommand = New SqlCommand(strSql, conn)
            Dim builder As New SqlCommandBuilder(adapter)
            
            builder.GetInsertCommand() ' нас интересует только добавление записей
            
            adapter.Update(EventsTable)
            EventsTable.AcceptChanges()
            conn.Close()
        End If
    End Sub
 
End Class
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
05.01.2020, 18:13
Вообще можно же настроить в БД UNIQUE INDEX указав какие данные в строке должны быть уникальными и при добавлении или изменении записи, при нахождении дублей в базе - будет выдано исключение, либо, использую INSERT IGNORE (вроде) такие записи будут просто игнорироваться и добавляться не будут... Очень хорошая штука и экономит кучу времени и лишнего кода на стороне ПО.
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,731
Записей в блоге: 1
05.01.2020, 19:09
Цитата Сообщение от Yury Komar Посмотреть сообщение
INSERT IGNORE
Перефразирую всем известную поговорку "Глупая голова рукам покоя не даёт".
Вот не знаю я SQL-ля , отсюда и такие решения, да ещё и людям советую
Юрий, ну где ты был раньше?

Однако автору при выгрузке данных из железа все равно надо делать проверку по дате, т.к. эти данные не имеют первичного ключа, наверное. То есть INSERT IGNORE нам никак не поможет, наверное.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
05.01.2020, 19:16
Uswer, INSERT IGNORE в связке с UNIQUE INDEX, в котором указываются колонки строк, которые должны содержать уникальные данные

Добавлено через 2 минуты
я в SQL тоже не профи, просто сталкивался с такой проблемой, и эта штука ооочень помогла решить вопрос дублей в базе
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,731
Записей в блоге: 1
05.01.2020, 19:26
Если в UNIQUE INDEX указать колонку со временем, то тоже не годится, наверное. Так как в событиях могут быть данные с одинаковым временем, но разными данными других полей, например "EmpID". В системах контроля доступа такое не редкость, в особенности если контроллеров в системе более одного (рассинхрон времени и т.п.). Поэтому мне кажется делать разбор до записи в БД все равно придётся на стороне ПО. НО знатоки SQL-ля смогут построить запрос для решения и этого нюанса

Не по теме:

Вопрос плавно перетёк в проблему построения SQL-запроса, поэтому автору лучше создать новую тему в соответствующем разделе.

0
Модератор
Эксперт .NET
 Аватар для Yury Komar
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

Касаемо
Цитата Сообщение от Uswer Посмотреть сообщение
Если в UNIQUE INDEX указать колонку со временем, то тоже не годится, наверное. Так как в событиях могут быть данные с одинаковым временем, но разными данными других полей, например "EmpID".
Это возможно , если колонка со временем будет в формате LONG до миллисекунд.
На момент записи в БД , таблица , куда производится запись, лочится и отзывается только на чтение. По сему
одновременная запись одного и того же значения будет практически невозможна.

По теме -первое , что бросается в глаза и вызывает сомнения на скриншотах ТС -это поле No
Если это ключевое поле с порядковыми номерами записей , то
1) Его тип должен быть INT ,а не DECIMAL
2) Правильно будет его сделать типом IDENTITY(1,1) , если речь идёт о MSSQL . т.е. с автоматическим приращением.
3) Оно не должно использоваться запросе INSERT , т.е. lvitem.subitems(0).text (исходя из скриншотов ТС ) должно
быть исключено из запроса , т.к. ошибка , судя по описанию ТС , идёт именно по этому полю, ибо других ключей
я просто не вижу , исходя из того , что все остальные поля (из скриншота) допускают пустое значение.
Более детально по вопросу смогу ответить после того ,как увижу структуру таблицы и ключей.

Пока всё.
За сим откланиваюсь.
Всех ещё раз с праздником/ками !!!
2
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
07.01.2020, 10:56  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
' Здесь Mass это массив с данными из контроллера, я фиг знаю как ты их получаешь!
Метод Иморта у меня сейчас так работает:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#Region "AttLogs"
    Private Sub btnGetGeneralLogData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetGeneralLogData.Click
If bIsConnected = False Then
            MsgBox("Please connect the device first", MsgBoxStyle.Exclamation, "Error")
            Return
        End If
        If axCZKEM1.GetDeviceStatus(iMachineNumber, 6, iValue) = True Then 'Here we use the function "GetDeviceStatus" to get the record's count.The parameter "Status" is 6.
            ToolStripLabel1.Text = "The count in the device is :   " + iValue.ToString()
 
 
            ' "The count of the AttLogs in the device is " & "+ iValue.ToString()"
        End If
 
        Dim sdwEnrollNumber As String = ""
        Dim idwVerifyMode As Integer
        Dim idwInOutMode As Integer
        Dim idwYear As Integer
        Dim idwMonth As Integer
        Dim idwDay As Integer
        Dim idwHour As Integer
        Dim idwMinute As Integer
        Dim idwSecond As Integer
        Dim idwWorkcode As Integer
 
        Dim idwErrorCode As Integer
        Dim iGLCount = 0
 Cursor = Cursors.WaitCursor
  axCZKEM1.EnableDevice(iMachineNumber, False) 'disable the device
        If axCZKEM1.ReadGeneralLogData(iMachineNumber) Then 'read all the attendance records to the memory
            'get records from the memory
            While axCZKEM1.SSR_GetGeneralLogData(iMachineNumber, sdwEnrollNumber, idwVerifyMode, idwInOutMode, idwYear, idwMonth, idwDay, idwHour, idwMinute, idwSecond, idwWorkcode)
                iGLCount += 1
  If DataGridView1.DataSource Is Nothing Then
                    With DataGridView1
                        .Rows.Add(iGLCount.ToString, sdwEnrollNumber, idwVerifyMode.ToString, idwInOutMode.ToString, idwYear.ToString() & "-" + idwMonth.ToString() & "-" & idwDay.ToString() & " " & idwHour.ToString() & ":" & idwMinute.ToString() & ":" & idwSecond.ToString(), idwWorkcode.ToString)
                    End With
 
 
                End If
 
 
            End While
        Else
            Cursor = Cursors.Default
            axCZKEM1.GetLastError(idwErrorCode)
            If idwErrorCode <> 0 Then
                MsgBox("Reading data from terminal failed,ErrorCode: " & idwErrorCode, MsgBoxStyle.Exclamation, "Error")
            Else
                MsgBox("No data from terminal returns!", MsgBoxStyle.Exclamation, "Error")
            End If
        End If
 
        axCZKEM1.EnableDevice(iMachineNumber, True) 'enable the device
        Cursor = Cursors.Default
    End Sub
Цитата Сообщение от Yury Komar Посмотреть сообщение
и да, в UNIQUE INDEX указываются не колонкА, а колонкИ, тоесть ошибок с временем не должно быть, типа одно и то же время, но разные ID пользователей - это уже не уникальность, и поэтому такая запись добавится, как и должна.
При создании UNIQUE INDEX

SQL
1
2
CREATE UNIQUE INDEX uidx_pid
ON DataLog (No);
Выдает такую ошибку при сохранении

System.Data.SqlClient.SqlException: Cannot insert duplicate key in object 'dbo.DataLog'. The duplicate key value is (1).
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
07.01.2020, 11:34
так ваш "No" - это что такое?

Добавлено через 2 минуты
если индекс (порядковый номер записи) то, он, типа, не должен содержать дубликаты, а они, видимо, УЖЕ есть в базе
0
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
07.01.2020, 12:40  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
так ваш "No" - это что такое?
No Это Primary Key в моей базе данных

Цитата Сообщение от Yury Komar Посмотреть сообщение
если индекс (порядковый номер записи) то, он, типа, не должен содержать дубликаты, а они, видимо, УЖЕ есть в базе
Я удалил все записи из таблице.

Создал 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
Модератор
Эксперт .NET
 Аватар для Yury Komar
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
Цитата Сообщение от Yury Komar Посмотреть сообщение
А как вы добавляете, с указанием IGNORE?
Юр , у ТС MSSQL, судя по коду коннекта , INSERT IGNORE - нет там такой инструкции.

Цитата Сообщение от Fanka313 Посмотреть сообщение
далее сделал второй импорт где уже не 10 а 20 записей, и тут ошибка
Делайте проверку перед INSERT , как я писал выше - WHERE NOT EXISTS INSERT INTO
1
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
07.01.2020, 14:54  [ТС]
Цитата Сообщение от Kulma Посмотреть сообщение
WHERE NOT EXISTS INSERT INTO
Kulma имеете в виду так ?

VB.NET
1
2
                    
query3.CommandText = "WHERE NOT EXISTS 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 & "') "
Добавлено через 43 минуты
Цитата Сообщение от Kulma Посмотреть сообщение
WHERE NOT EXISTS INSERT INTO
Так правильно делать ?

VB.NET
1
2
3
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 & "') "
 
Select 'Date' Where not exists(select * from DataLog where Date='lvitem.subitems(2).text')
lvitem.subitems(0).text = ListViewItem
DataLog = SQL Table Name
Date= который не должен дублироватся
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
07.01.2020, 15:11
Kulma, о как... Тогда, ловить такие исключения и пропускать на уровне ПО...
0
 Аватар для Fanka313
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 32
07.01.2020, 16:04  [ТС]
Цитата Сообщение от Kulma Посмотреть сообщение
Делайте проверку перед INSERT
Изменил сейчас функцию кнопки сохранить на

VB.NET
1
2
3
4
5
6
7
8
9
10
 Private Sub btnSavetoDB_Click(sender As System.Object, e As System.EventArgs) Handles btnSavetoDB.Click
        Dim cmdsql As SqlCommand
        For row As Integer = 0 To DataGridView1.RowCount - 6
            Call connectsql()
            Dim simpan As String = "INSERT INTO DataLog VALUES ('" & DataGridView1.Rows(row).Cells(0).Value & "', '" & DataGridView1.Rows(row).Cells(1).Value & "', '" & DataGridView1.Rows(row).Cells(2).Value & "', '" & DataGridView1.Rows(row).Cells(3).Value & "', '" & DataGridView1.Rows(row).Cells(4).Value & "', '" & DataGridView1.Rows(row).Cells(5).Value & "') " & "Select 'Date' Where Not exists(select * from DataLog where Date='lvitem.subitems(2).text')"
 
            cmdsql = New SqlCommand(simpan, connsql)
            cmdsql.ExecuteNonQuery()
        Next
        MsgBox("Data Saved!")
Ошибка выдаеться сейчас такая:

System.Data.SqlClient.SqlException: 'Cannot insert duplicate key row in object 'dbo.DataLog' with unique index 'uidx_pid'. The duplicate key value is (1).
The statement has been terminated.'
0
1721 / 1524 / 165
Регистрация: 25.07.2015
Сообщений: 2,622
07.01.2020, 17:02
Цитата Сообщение от Fanka313 Посмотреть сообщение
Ошибка выдаеться сейчас такая
Ну так ничего не изменилось.
Вы поймите , что не важно откуда берутся данные , важно , что они дублируются в ключевом столбце.
По поводу Where Not exists почитайте транскрипцию или почитайте .
Так же можно использовать ( мне , к слову, больше по душе ) NOT IN
Простите , но с кодом сейчас заморачиваться нет возможности - собака после операции - капельницы/уколы и т.д ,
мозги только на ней сосредоточены.
1
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,731
Записей в блоге: 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2020, 00:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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