Как обнаружить это была повторяющаяся запись на VB. NET? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть проблема с тем, чтобы избежать или обнаружить повторный ввод данных в VB. NET с использованием SQL Сервера, а также всплывающее сообщение при наличии повторяющегося ввода.

Это мой код кнопки добавления :

Dim sql = "INSERT INTO studentAttendence(studentID, date, time, subject, attendence) " &
    "VALUES(@studentID, @date, @time, @subject, @attendence)" &
    "WHERE NOT EXISTS(SELECT * FROM studentAttendence WHERE studentID = @studentID)"

Using cn As New SqlConnection("My sql Connection string")
    Dim commands As SqlCommand = New SqlCommand(sql, cn)

    commands.Parameters.Add("@studentID", SqlDbType.NVarChar).Value = TextBox1.Text
    commands.Parameters.Add("@date", SqlDbType.NVarChar).Value = DateTimePicker1.Text
    commands.Parameters.Add("@time", SqlDbType.NVarChar).Value = DateTimePicker2.Text
    commands.Parameters.Add("@subject", SqlDbType.NVarChar).Value = ComboBox1.Text
    commands.Parameters.Add("@attendence", SqlDbType.NVarChar).Value = ComboBox2.Text

    commands.ExecuteNonQuery()
End Using

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

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы можете использовать If Not Exists перед вставкой. Этот метод требует только одного попадания в базу данных. Добавьте запятую в конце первой строки блока Using, затем удалите Dim перед командами. Это будет включать команды в блоке Using.

Private Function InsertAttendance() As Integer
    Dim sql = "If Not Exists (Select 1 From studentAttendence 
Where studnetID = @studentID And date = @date And subject = @subject)
INSERT INTO studentAttendence(studentID, date, time, subject, attendence) 
VALUES(@studentID, @date, @time, @subject, @attendence);"
    Dim NumRowsAffected As Integer
    Using cn As New SqlConnection("My sql Connection string"),
           commands As SqlCommand = New SqlCommand(sql, cn)
        commands.Parameters.Add("@studentID", SqlDbType.NVarChar).Value = TextBox1.Text
        commands.Parameters.Add("@date", SqlDbType.NVarChar).Value = DateTimePicker1.Text
        commands.Parameters.Add("@time", SqlDbType.NVarChar).Value = DateTimePicker2.Text
        commands.Parameters.Add("@subject", SqlDbType.NVarChar).Value = ComboBox1.Text
        commands.Parameters.Add("@attendence", SqlDbType.NVarChar).Value = ComboBox2.Text
        cn.Open()
        NumRowsAffected = commands.ExecuteNonQuery()
    End Using
    Return NumRowsAffected
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        If InsertAttendance() = 1 Then
            MessageBox.Show("Success")
        Else
            MessageBox.Show("Duplicate Entry")
        End If
    Catch ex As Exception
        MessageBox.Show($"Error Entering Attendance {ex.Message}")
    End Try
End Sub

Обязательно проверьте типы данных ваших параметров с базой данных.

0 голосов
/ 02 мая 2020

Вы должны создать функцию, которая запрашивает вашу таблицу данных, чтобы возвращать количество строк, где Date, Subject и StudentId соответствуют тому, что вы хотите вставить. Если возвращенный результат больше 0, отобразите сообщение.

Вот функция, которая возвращает -1, если что-то пошло не так, или количество строк:

Private Function GetRowCount(ByVal studentIdParameter As String, ByVal dateParameter As DateTime, ByVal subjectParameter As String) As Integer
    'Declare the object to return
    Dim count As Integer = -1

    'Declare the connection object
    Dim con As OleDbConnection

    'Wrap code in Try/Catch
    Try
        'Set the connection object to a new instance
        'TODO: Change "My Connection String Here" with a valid connection string
        con = New OleDbConnection("My Connection String Here")

        'Create a new instance of the command object
        'TODO: Change [ID] to a valid column
        Using cmd As OleDbCommand = New OleDbCommand("SELECT Count([ID]) FROM [MyTable] WHERE studentID=@studentId, AND date=@date AND subject=@subject", con)
            'Parameterize the query
            cmd.Parameters.Add("@studentId", OleDbType.NVarChar).Value = studentIdParameter
            cmd.Parameters.Add("@date", OleDbType.DBDate).Value = dateParameter.Date
            cmd.Parameters.Add("@subject", OleDbType.NVarChar).Value = subjectParameter

            'Open the connection
            con.Open()

            'Use ExecuteScalar to return a single value
            count = Convert.ToInt32(cmd.ExecuteScalar())

            'Close the connection
            con.Close()
        End Using
    Catch ex As Exception
        'Display the error
        Console.WriteLine(ex.Message)
    Finally
        'Check if the connection object was initialized
        If con IsNot Nothing Then
            If con.State = ConnectionState.Open Then
                'Close the connection if it was left open(exception thrown)
                con.Close()
            End If

            'Dispose of the connection object
            con.Dispose()
        End If
    End Try

    'Return the row count
    Return count
End Function

Чтобы реализовать это, вы сделал бы что-то вроде:

Dim rowCount = GetRowCount(TextBox1.Text, DateTimePicker1.Value, ComboBox1.Text)
If (rowCount = -1) Then
    MessageBox.Show("Something went wrong checking for duplicates")
ElseIf (rowCount = 0) Then
    ' Insert record
Else
    MessageBox.Show("A record already exists with this studentId, date, and subject.")
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...