Jake Robert Ответов: 3

Проверка дубликатов записей при обновлении базы данных vb.net


Я уже хорошо справляюсь с проверкой при добавлении, и она работает именно так, как я хотел.
Я использовал oledbDataReader для проверки своей базы данных
Это мой пример кода, используемого при проверке базы данных (этот код предназначен для добавления новой записи)

  Dim CompQuery As String = "SELECT * FROM Company WHERE CompanyName = '" & txtCompName.Text & "' AND AssociationID = " & cmbUnderAssoc.SelectedValue & " "
 Dim compCommand As OleDbCommand = New OleDbCommand(CompQuery, con)
        compCommand.Parameters.AddWithValue("CompanyName", txtCompName.Text)
        compCommand.Parameters.AddWithValue("AssociationID", cmbUnderAssoc.SelectedValue)
        con.Close()
con.Open()
                Using compReader As OleDbDataReader = compCommand.ExecuteReader
                    If compReader.HasRows Then
                        MsgBox("Entry already exist! Please input new entry")
                        Exit Sub
                    Else


Я попробовал ту же логику при обновлении, но она блокирует даже редактируемую запись. Поэтому мне нужно изменить название компании или ее ассоциации, чтобы она обновилась.

Я хочу, чтобы редактируемая запись могла обновляться в любое время даже без внесения изменений, в то время как datareader будет сравнивать эту запись с другими записями в базе данных, чтобы проверить, будет ли у нее какая-либо дублирующая запись при обновлении.

Заранее спасибо :)

OriginalGriff

Что такое сам запрос?
То есть, что находится в строке CompQuery?

Jake Robert

Вот он

Dim CompQuery As String = "SELECT * FROM Company WHERE CompanyName = '" & txtCompName.Текст & "' и AssociationID = " & cmbUnderAssoc.SelectedValue & " "

Я также обновил свой вопрос для лучшего обзора.

Maciej Los

Что это за база данных?

Jake Robert

Я использую MS Access в качестве базы данных.

Maciej Los

В дополнение к решению 1 от OriginalGriff, я бы предложил изменить логику, которую вы используете. Если вы хотите добавить данные и предотвратить дубликаты, используйте query with СУЩЕСТВУЕТ[^] заявление. Пожалуйста, см. Пример - с инструкцией INSERT раздел.

Jake Robert

Я тоже попробую твою идею. Спасибо :) Обновится, как только я его протестирую.

3 Ответов

Рейтинг:
21

OriginalGriff

Когда вы читали о параметризованных запросах, вы заметили, как вы должны были их использовать?
Этот запрос:


Dim CompQuery As String = "SELECT * FROM Company WHERE CompanyName = '" & txtCompName.Text & "' AND AssociationID = " & cmbUnderAssoc.SelectedValue & " "
не использует параметры. Вместо этого он использует текст напрямую и широко открыт для SQL-инъекций.
Попробовать это:
Dim CompQuery As String = "SELECT COUNT(*) FROM Company WHERE CompanyName = ? AND AssociationID = ?"
Dim compCommand As OleDbCommand = New OleDbCommand(CompQuery, con)
        compCommand.Parameters.AddWithValue("?", txtCompName.Text)
        compCommand.Parameters.AddWithValue("?", cmbUnderAssoc.SelectedValue)
        con.Close()
con.Open()
                    If Convert.ToInt32(compCommand.ExecuteScalar()) > 0 Then
                        MsgBox("Entry already exist! Please input new entry")
                        Exit Sub
                    Else


Jake Robert

Попробую, может быть, завтра. У меня уже голова идет кругом. Я сообщу вам об этом, как только протестирую ваше решение.

Спасибо :)

Jake Robert

Он работал также, когда я добавляю/вставляю новую запись, но все же блокирует текущую выбранную запись при обновлении. Он также считывает его как дубликат даже при обновлении.

Должен ли я создавать еще один запрос и команду при обновлении?

Рейтинг:
2

Maciej Los

Обновление[^] оператор используется для обновления записей на основе критериев. Таким образом, он не может создавать дубликаты!

UPDATE TableName
SET FieldName = "Whatever"
WHERE <Condition>


Наконец, ваш запрос должен выглядеть следующим образом:
Dim CompQuery As String = "UPDATE * Company" & vbCr & _
"SET CompanyName = '" & txtCompName.Text & "' AND AssociationID = " & cmbUnderAssoc.SelectedValue & vbCr & _
"WHERE CompanyId = " & txtComapnyId.Text & " "


Примечание: Я использую CompanyId как первичный ключ[^] от Company стол.


Рейтинг:
0

Member 14966431

Простое решение состоит в том, чтобы удалить эту конкретную запись и с обновлениями вставить снова как новую запись, которая соответствует точным критериям при добавлении.


CHill60

Очень расточительный подход и не рекомендуется