Как быстро обновить MySQL таблицу через al oop, используя VB.net - PullRequest
0 голосов
/ 22 января 2020

Мой код для обновления таблицы mysql, содержащей более 2000 строк через al oop с использованием VB. net работает нормально, но слишком медленно. Есть ли способ обновить его быстрее? Кто-нибудь, пожалуйста, помогите. Спасибо. Мой код указан ниже.

Dim mysqlconn = New MySqlConnection
    mysqlconn.ConnectionString = "server=localhost;user id=root;password=1234;database=Share"
    mysqlconn.Open()
    Dim adapter As New MySqlDataAdapter("SELECT * FROM name_list;", mysqlconn)
    Dim datatable As New DataTable()
    adapter.Fill(datatable)
    Dim cmd As New MySqlCommand
    cmd.Connection = mysqlconn
    Dim sql As String
    Dim i as integer = 0

    While i <= datatable.Rows.Count - 1

        Dim sy As String = datatable.Rows(i).Item(3).ToString.Trim

        sql = "UPDATE Name_list Set Numerology = '" & "N-" & variable1 & " S- " & variable2 & "',FSTLetter = '" & variable3 & "',Timing = '" & vriable4 & "',P_Numerology = '" & variable5 & "' WHERE Symbol = '" & sy & "'"
        sy = ""
        cmd.CommandText = sql
        cmd.ExecuteNonQuery()

        i = i + 1

    End While

    adapter.Fill(datatable)
    DataGridView1.DataSource = datatable
    DataGridView1.Refresh()

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Не называйте переменные так же, как имена классов (DataTable, datatable). Vb. net нечувствителен к регистру, поэтому он путает intellisense.

Соединения и команды базы данных должны быть закрыты и удалены , Блоки Using делают это за вас, даже если есть ошибка.

Вы можете установить строку соединения, передав ее непосредственно в конструктор соединения. Аналогично, вы можете установить текст команды и соединение, передав его конструктору команды.

Не открывайте соединение до тех пор, пока оно не будет использовано. В этом случае нам не нужен DataAdapter, но если вы используете его, совсем не обязательно открывать соединение. .Fill метод DataAdapter откроет и закроет соединение. Однако, если DataAdapter найдет открытое соединение, оно оставит его открытым.

Чтобы избежать путаницы, я создал 2 таблицы данных. Я использовал одно соединение, но я открывал и закрывал его каждый раз, когда он используется. Он не удаляется до последнего End Using.

Первая команда возвращает только столбец sy. Замените Column4_Name на фактическое имя столбца. Мы не хотим извлекать данные, которые нам не нужны, поэтому Select *.

Всегда используйте параметры, чтобы избежать sql внедрения, которое может повредить вашу базу данных. Вы должны проверить свою базу данных для типов полей. Я должен был угадать. Устанавливается каждое значение параметра, кроме sy, которое изменяется на каждой итерации.

Нет необходимости закрывать соединение после последней команды Select, так как при последнем завершении использования будет закрываться и удалять.

После того, как соединение установлено закрыто, мы обновляем пользовательский интерфейс.

Private Sub OPCode(variable1 As String, variable2 As String, variable3 As String, variable4 As String, variable5 As String)
    Dim dtBeforeUpdate As New DataTable()
    Dim dtAfterUpdate As New DataTable()
    Using mysqlconn = New MySqlConnection("server=localhost;user id=root;password=1234;database=Share")
        Using cmd As New MySqlCommand("SELECT Column4_Name FROM name_list;", mysqlconn)
            mysqlconn.Open()
            dtBeforeUpdate.Load(cmd.ExecuteReader)
            mysqlconn.Close()
        End Using
        Using cmd As New MySqlCommand($"UPDATE Name_list Set Numerology = @Numerologh, FSTLetter = @FST, Timing = @Timing, P_Numerology = @P_Numerology WHERE Symbol =  @sy ", mysqlconn)
            cmd.Parameters.Add("@Numerology", MySqlDbType.String).Value = $"N-{variable1} S- {variable2}"
            cmd.Parameters.Add("@FST", MySqlDbType.String).Value = variable3
            cmd.Parameters.Add("@Timing", MySqlDbType.String).Value = variable4
            cmd.Parameters.Add("@P_Numerology", MySqlDbType.String).Value = variable5
            cmd.Parameters.Add("@sy", MySqlDbType.String)
            mysqlconn.Open()
            For Each row As DataRow In dtBeforeUpdate.Rows
                cmd.Parameters("@sy").Value = row(0).ToString.Trim
                cmd.ExecuteNonQuery()
            Next
            mysqlconn.Close()
        End Using
        Using cmd As New MySqlCommand("Select * From Name_list;", mysqlconn)
            mysqlconn.Open()
            dtAfterUpdate.Load(cmd.ExecuteReader)
        End Using
    End Using
    DataGridView1.DataSource = dtAfterUpdate
End Sub

На самом деле, я не понимаю. Похоже, вы обновили всю таблицу с теми же данными. Ожидаете ли вы переменную1, переменную2 и т. Д. c. изменить как-нибудь?

0 голосов
/ 23 января 2020

Не знаю, откуда берутся ваша переменная1, переменная2 и т. Д. c, но они выглядят стати c, поэтому ваш l oop выглядит несколько бессмысленно. Вы обновляете каждую строку в l oop до тех же самых значений (если нет другого кода, который вы не показываете), поэтому просто обновите таблицу без l oop:

Using con As New MySQLConnection con.ConnectionString = "server=localhost;user id=root;password=1234;database=Share" con.Open Using cmd As New MySQLCommand cmd.Connection = con cmd.CommandText = "UPDATE Name_list Set Numerology = '" & "N-" & variable1 & " S- " & variable2 & "',FSTLetter = '" & variable3 & "',Timing = '" & vriable4 & "',P_Numerology = '" & variable5 & "'" cmd.ExecuteNonQuery End Using End Using

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...