Member 10804809 Ответов: 3

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


У меня есть vb.net приложение с базой данных OLeDb,
Вот мой код для предотвращения повторного ввода "ID" в базу данных, идентификатор не является первичным ключом.
Но он показывает msg - "уже существует" для каждой записи и не сохраняет ни одной записи в базе данных.
Так что же делать?

Dim cmd As New OleDbCommand
       Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Satyam\Documents\Pathology.accdb")

       Dim queryResult As Integer
       Dim sqlQRY As String = "SELECT COUNT(*) AS FROM ESRRegister WHERE ID = '" & IDtxt.Text & "'"
       con.Open()
       cmd.Connection = con
       cmd.CommandType = CommandType.Text
       If queryResult > 0 Then
           cmd.CommandText = "insert into ESRRegister (Dt,ID)VALUES ('" & Dttxt.Text & "' , '" & IDtxt.Text & "')"
           queryResult = cmd.ExecuteScalar()
           MsgBox("Added Successfuly")
       Else

           MessageBox.Show("Already Exists!", "ALI ENTERPRISES", MessageBoxButtons.OK, MessageBoxIcon.Information)

       End If

[no name]

На самом деле вы не проверяете, существует ли идентификатор в вашей базе данных в вашей атаке SQL-инъекции, ожидающей выполнения запроса. На самом деле вам придется выполнить этот запрос в какой-то момент времени.

3 Ответов

Рейтинг:
2

Maciej Los

queryResult был объявлен, но никогда не инициировался, он равен 0 (ноль).
Вам нужно выполнить запрос (сохраненный в sqlQRY переменная) и получить возвращаемое ею значение: Объект oledbcommand.Метод ExecuteScalar [^].

Dim cmd As New OleDbCommand(sqlQRY, con)
con.Open()
queryResult=cmd.ExecuteScalar()


Рейтинг:
2

Nirav Prabtani

ваш код должен быть таким.. :)

Dim commandText = "SELECT COUNT(*) AS FROM ESRRegister WHERE ID = '" & IDtxt.Text & "'"
Using(conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Satyam\Documents\Pathology.accdb")
Using(select = New OleDbCommand(commandText, conn)
    conn.open()
    Dim count = Convert.ToInt32(select.ExecuteScalar())
    if count > 0 Then

        MessageBox.Show("Already Exists!", "ALI ENTERPRISES", MessageBoxButtons.OK, MessageBoxIcon.Information)
else
         'Your insert code
  
    End If


Member 10804809

Можете ли вы просто переписать мой полный код, как я сделал в соответствии с вашим предложением, но не смог найти помощь?
Я просто переписал свой код, как показано ниже, но он сказал, что ошибка as - Name 'conn' не объявлена.
мой новый код, как показано ниже

Dim commandText = " SELECT COUNT (*) AS FROM ESRRegister WHERE ID = '" & IDtxt.Текст &"'"
Используя (соед = новый объект oledbconnection("поставщик=Майкрософт.Туз.Oledb для.12.0;Источник Данных=С:\Пользователи\Сатйам\Документы\Патологии.# то # "))
Using ("select = New OleDbCommand(commandText, conn)")
соед.открыть()
Дим кол-во = конвертировать.ToInt32 ("select.Executescalar так()")
Если count > 0, то

Ящик для сообщений.Show ("уже существует!", "ALI ENTERPRISES", MessageBoxButtons.Хорошо, MessageBoxIcon.Информация)
Еще
- Ваш код вставки
УМК.CommandText = " вставить в ESRRegister (Dt,ID)значения ('" & Dttxt.Текст &"', '" & IDtxt.Текст &"')"
queryResult = cmd.Executescalar так()
MsgBox ("Добавлено Успешно")
Конец, Если
Конец Использования
Конец Использования

Member 10804809

ПЛ скажи мне что делать

Рейтинг:
0

Member 13424608

Public Function valueExists(ByVal column As String, ByVal tablename As String, ByVal input As String) As Boolean
        Dim list As New List(Of String)
        Dim col_arr As String()

        sqlstr = "SELECT " + column + " FROM " + tablename
        Dim dt As DataTable = getDataTable(sqlstr)

        For i As Integer = 0 To dt.Rows.Count - 1
            list.Add(dt.Rows(i)(column))
        Next

        col_arr = list.ToArray

        For i As Integer = 0 To col_arr.Length - 1
            If col_arr(i) = input Then
                Return True
            Else
                Return False
            End If
        Next
        Return False
End Function

И реализовать эту функцию
If valueExists("<column_name>", "<table_name>", thetextcomponent.Text) = True Then
        MsgBox("Duplicate Product Entry Not Allowed", vbCritical + vbOKOnly)
        Exit Sub
End If


Dave Kreskowiak

Вы опоздали к обсуждению всего на 3 с половиной года.