Дублирование строк и несоответствие строк в mysql - PullRequest
0 голосов
/ 25 марта 2020

моя проблема в том, что моя строка в MySQL дублируется и не соответствует после регистрации, например, 1 человека с 3 цыплятами, и в datagridview отображается как 1 человек с 3 цыплятами, но если я добавлю еще 1 человека с 3 цыплятами, то они оба получат дублируется вдвое (т. е. 12 строк вместо 6 строк) и пример несоответствия строк: Имя_пользователя имеет B, C, D цыпленок и Имя Bentryname имеет E, F, G цыпленок и Bentryname будет иметь B, C, D цыпленок тоже Я надеюсь, что это проясняет все и извините за путаницу, и это показывает на изображении, которое я разместил здесь DGVdups_and_mismatch

это кнопку добавить нажмите


    Private Sub ButtonAdd_Click(sender As Object, e As EventArgs) Handles ButtonAdd.Click
        Dim chicken As New cockeryclass
        Dim dumbbell As New ChickenClass

        Dim fname As String = TextBoxfname.Text
        Dim lname As String = TextBoxlname.Text
        Dim nume As Integer = TextBoxNume3.Text
        Dim ename As String = TextBoxEntryname.Text

        Dim Chicken1 As String = TextBoxChicken1.Text
        Dim Chicken2 As String = TextBoxChicken2.Text
        Dim Chicken3 As String = TextBoxChicken3.Text


        Dim eno1 As String = TextBoxEntryNo1.Text
        Dim eno2 As String = TextBoxEntryNo2.Text
        Dim eno3 As String = TextBoxEntryNo3.Text

        Dim weightlb1 As String = ComboBoxWeightlb1.Text
        Dim weightlb2 As String = ComboBoxWeightlb2.Text
        Dim weightlb3 As String = ComboBoxWeightlb3.Text


        Dim weightoz1 As String = ComboBoxWeightOz1.Text
        Dim weightoz2 As String = ComboBoxWeightOz2.Text
        Dim weightoz3 As String = ComboBoxWeightOz3.Text




        If verif() And chicken.InsertRooster(fname, lname, nume, ename) And dumbbell.insertbreedenolboz1(Chicken1, eno1, weightlb1, weightoz1) And dumbbell.insertbreedenolboz2(Chicken2, eno2, weightlb2, weightoz2) And
            dumbbell.insertbreedenolboz3(Chicken3, eno3, weightlb3, weightoz3) Then

            MsgBox("error")
        Else
            MsgBox("success")

        End If

    End Sub
    Function verif() As Boolean

        If TextBoxfname.Text.Trim = "" Or TextBoxlname.Text.Trim = "" Or TextBoxEntryname.Text.Trim = "" Then
            Return False
        Else
            Return True
        End If

    End Function


End Class```

this is my 2 classes cockeryclass and Chickenclass


```Imports MySql.Data.MySqlClient
Public Class ChickenClass
    Dim db As New MYCON
    Public Function insertbreedenolboz1(ByVal breed1 As String, ByVal eno1 As String, ByVal weightlb1 As String, ByVal weightoz1 As String) As Boolean

        Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`,`chicken`,`lb`,`oz`,`financer_F_id`) VALUES (@eno,@ckn,@lb,@oz)", db.getconnection)
            Command.Parameters.Add("@ckn", MySqlDbType.String).Value = breed1
            Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno1
            Command.Parameters.Add("@lb", MySqlDbType.String).Value = weightlb1
            Command.Parameters.Add("@oz", MySqlDbType.String).Value = weightoz1


            db.openConnection()

            If Command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If
        End Using

    End Function

    Public Function insertbreedenolboz2(ByVal breed2 As String, ByVal eno2 As String, ByVal weightlb2 As String, ByVal weightoz2 As String) As Boolean
        Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`,`chicken`,`lb`,`oz`,`financer_F_id`) VALUES (@eno,@ckn,@lb,@oz)", db.getconnection)
            Command.Parameters.Add("@ckn", MySqlDbType.String).Value = breed2
            Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno2
            Command.Parameters.Add("@lb", MySqlDbType.String).Value = weightlb2
            Command.Parameters.Add("@oz", MySqlDbType.String).Value = weightoz2


            db.openConnection()

            If Command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If
        End Using

    End Function
    Public Function insertbreedenolboz3(ByVal breed3 As String, ByVal eno3 As String, ByVal weightlb3 As String, ByVal weightoz3 As String) As Boolean
        Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`,`chicken`,`lb`,`oz`,`financer_F_id`) VALUES (@eno,@ckn,@lb,@oz)", db.getconnection)
            Command.Parameters.Add("@ckn", MySqlDbType.String).Value = breed3
            Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno3
            Command.Parameters.Add("@lb", MySqlDbType.String).Value = weightlb3
            Command.Parameters.Add("@oz", MySqlDbType.String).Value = weightoz3


            db.openConnection()
If Command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If

        End Using

    End Function

End Class```

```Imports MySql.Data.MySqlClient
Public Class cockeryclass
    Dim db As New MYCON
    Public Function InsertRooster(ByVal fname As String, ByVal lname As String, ByVal nume As String, ByVal ename As String) As Boolean

        Using command As New MySqlCommand("Insert into `derbabe`.`financer`( fname, lname,entry_name,num_entries) values (@fn,@ln,@ename,@nume);", db.getconnection)

            command.Parameters.Add("@fn", MySqlDbType.VarChar).Value = fname
            command.Parameters.Add("@ln", MySqlDbType.VarChar).Value = lname
            command.Parameters.Add("@ename", MySqlDbType.VarChar).Value = ename
            command.Parameters.Add("@nume", MySqlDbType.String).Value = nume

            db.openConnection()

            If command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If
        End Using

    End Function

    Public Function inserteno1(ByVal eno1 As String) As Boolean
        Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`) VALUES (@eno)", db.getconnection)
            Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno1
            db.openConnection()
            If Command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If
        End Using

    End Function

    Public Function inserteno2(ByVal eno2 As String) As Boolean
        Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`) VALUES (@eno)", db.getconnection)
            Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno2
            db.openConnection()
            If Command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If
        End Using

    End Function

    Public Function inserteno3(ByVal eno3 As String) As Boolean
        Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`) VALUES (@eno)", db.getconnection)
            Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno3
            db.openConnection()
            If Command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If
        End Using

    End Function

    Function getfighters(ByVal command As MySqlCommand) As DataTable

        command.Connection = db.getconnection
        Dim adapter As New MySqlDataAdapter(command)
        Dim tbl As New DataTable

        adapter.Fill(tbl)

        Return tbl
    End Function

End Class

1 Ответ

0 голосов
/ 26 марта 2020

Некоторые проблемы с вашим кодом, которые я вижу ...

If verif() And chicken.InsertRooster(fname, lname, nume, ename) '...

Измените оператор If, чтобы использовать AndAlso между условиями. Это приводит к короткому замыканию If, поскольку оно завершает работу, как только находит False. Таким образом, функции вашей базы данных не будут выполняться, если verif вернет False.

If TextBoxfname.Text.Trim = "" Or TextBoxlname.Text.Trim = "" '...

Аналогично, OrElse замкнет If, как только условие вернется True.

Dim nume As Integer = TextBoxNume3.Text

Свойство .Text для TextBox является String. Когда Option Strict включен (и он должен быть включен), вы не можете присвоить String переменной типа Integer.

If verif() AndAlso chicken.InsertRooster(fname, lname, nume, ename) '...

и

Public Function InsertRooster(ByVal fname As String, ByVal lname As String, ByVal nume As String, '...

Вы не можете пройти и Integer (nume) до Function, ожидающего String (ByVal nume As String). Я изменил объявление nume на String.

      MsgBox("error")
    Else
        MsgBox("success")

Я думаю, что вы перевернули свои окна сообщений.

insertbreedenolboz1
insertbreedenolboz2
insertbreedenolboz3

Каждая функция выполняет одно и то же. Вы просто отправляете разные параметры. Удалите последние 2 и измените код своей кнопки, просто наберите insertbreedenolboz1.

inserteno1
inserteno2
inserteno3

То же, что и выше. Удалите последние 2 и просто вызовите inserteno1.

"INSERT INTO `rooster` (`entry_no`,`chicken`,`lb`,`oz`) VALUES (@eno,@ckn,@lb,@oz)"

Этот оператор вставки не будет работать, потому что у вас есть 5 полей, но только 4 параметра. Я действительно не могу это исправить, не зная больше, поэтому я просто удалил financer_F_id.

Я избавился от всего, что есть db.Connection, и использовал соединение, локальное для каждого метода, чтобы его можно было закрыть и удалить. , Строка подключения может быть изменена на уровне класса.

Ваши классы могут быть объединены в один DataAccess класс. Создайте соединение для каждого метода, чтобы вы могли правильно закрыть и удалить соединение.

Проверьте типы данных всех ваших полей в базе данных. Было бы необычно хранить числа в виде строк.

Private Sub ButtonAdd_Click(sender As Object, e As EventArgs) Handles ButtonAdd.Click
    Dim da As New DataAccess

    Dim fname As String = TextBoxfname.Text
    Dim lname As String = TextBoxlname.Text
    Dim nume As String = TextBoxNume3.Text
    Dim ename As String = TextBoxEntryname.Text

    Dim Chicken1 As String = TextBoxChicken1.Text
    Dim Chicken2 As String = TextBoxChicken2.Text
    Dim Chicken3 As String = TextBoxChicken3.Text


    Dim eno1 As String = TextBoxEntryNo1.Text
    Dim eno2 As String = TextBoxEntryNo2.Text
    Dim eno3 As String = TextBoxEntryNo3.Text

    Dim weightlb1 As String = ComboBoxWeightlb1.Text
    Dim weightlb2 As String = ComboBoxWeightlb2.Text
    Dim weightlb3 As String = ComboBoxWeightlb3.Text


    Dim weightoz1 As String = ComboBoxWeightOz1.Text
    Dim weightoz2 As String = ComboBoxWeightOz2.Text
    Dim weightoz3 As String = ComboBoxWeightOz3.Text

    If verif() AndAlso da.InsertRooster(fname, lname, nume, ename) AndAlso da.insertbreedenolboz1(Chicken1, eno1, weightlb1, weightoz1) AndAlso da.insertbreedenolboz1(Chicken2, eno2, weightlb2, weightoz2) AndAlso da.insertbreedenolboz1(Chicken3, eno3, weightlb3, weightoz3) Then
        MsgBox("success")
    Else
        MsgBox("error")
    End If

End Sub

Function verif() As Boolean
    If TextBoxfname.Text.Trim = "" OrElse TextBoxlname.Text.Trim = "" OrElse TextBoxEntryname.Text.Trim = "" Then
        Return False
    Else
        Return True
    End If
End Function



Public Class DataAccess

    Private conString As String = "Your connection string"

    Public Function insertbreedenolboz1(ByVal breed1 As String, ByVal eno1 As String, ByVal weightlb1 As String, ByVal weightoz1 As String) As Boolean
        Using cn As New MySqlConnection(conString)
            Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`,`chicken`,`lb`,`oz`,`financer_F_id`) VALUES (@eno,@ckn,@lb,@oz)", cn)
                Command.Parameters.Add("@ckn", MySqlDbType.String).Value = breed1
                Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno1
                Command.Parameters.Add("@lb", MySqlDbType.String).Value = weightlb1
                Command.Parameters.Add("@oz", MySqlDbType.String).Value = weightoz1
                cn.Open()
                If Command.ExecuteNonQuery() = 1 Then
                    Return True
                Else
                    Return False
                End If
            End Using
        End Using
    End Function

    Public Function InsertRooster(ByVal fname As String, ByVal lname As String, ByVal nume As String, ByVal ename As String) As Boolean
        Using cn As New MySqlConnection(conString)
            Using command As New MySqlCommand("Insert into `derbabe`.`financer`( fname, lname,entry_name,num_entries) values (@fn,@ln,@ename,@nume);", cn)
                command.Parameters.Add("@fn", MySqlDbType.VarChar).Value = fname
                command.Parameters.Add("@ln", MySqlDbType.VarChar).Value = lname
                command.Parameters.Add("@ename", MySqlDbType.VarChar).Value = ename
                command.Parameters.Add("@nume", MySqlDbType.String).Value = nume
                cn.Open()
                If command.ExecuteNonQuery() = 1 Then
                    Return True
                Else
                    Return False
                End If
            End Using
        End Using
    End Function

    Public Function inserteno1(ByVal eno1 As String) As Boolean
        Using cn As New MySqlConnection(conString)
            Using Command As New MySqlCommand("INSERT INTO `rooster` (`entry_no`) VALUES (@eno)", cn)
                Command.Parameters.Add("@eno", MySqlDbType.String).Value = eno1
                cn.Open()
                If Command.ExecuteNonQuery() = 1 Then
                    Return True
                Else
                    Return False
                End If
            End Using
        End Using
    End Function

End Class
...