Удаление SQL datarow из таблицы смахивает позицию первой и второй строки в vb.net - PullRequest
0 голосов
/ 11 апреля 2020

добавление обновлений все нормально, даже команда удаления работает, но странная часть - после выполнения команды del из vb. net приложение удаляет позицию EMPLOYEE_ID AND NAME, которая обычно отображается в datagridview после добавления или обновление, но, в частности, после удаления позиции записи в изменениях столбцов, пока я не остановлю приложение и не перезапущу весь проект для отладки

     Dim con As New MySqlConnection("server=localhost; user=root; password=Masoom1; database=airtech_db; convert zero datetime=true;")
    Dim cmd As New MySqlCommand
    Dim dt As New DataTable
    Dim da As New MySqlDataAdapter
    Dim sql As String
    Dim DR As MySqlDataReader
    Dim SQL_CMD_TXT As String
  SQL_CMD_TXT = "DELETE FROM `employees` WHERE (`EMPLOYEE_ID` ='" &
            EMPLOYEE_DEL_FRM.DEL_ID_TXT.Text & "');  SELECT * FROM `employees`;"
        EMPLOYEE_DEL_FRM.Controls.Add(OBJECT_DATAGRIDVIEW)
        With OBJECT_DATAGRIDVIEW
            .Size = New Size(587, 242)
            .Location = New Size(221, 171)
        End With
 Try
        'DB CMD EXECUTION
        con.Open()
        With cmd
            sql = SQL_CMD_TXT
            .Connection = con
            .CommandText = sql
        End With
        da.SelectCommand = cmd
        da.Fill(dt)
        'Command for datagridview object
        With OBJECT_DATAGRIDVIEW
            .DataSource = dt
            'Scroll to the last row.
            .Name = "MYDATAGRIDVIEW"
            .FirstDisplayedScrollingRowIndex = .RowCount - 1
        End With
        con.Close()

    Catch ex As Exception
        Dim MEB = MessageBox.Show("ERROR FOR SQL CMD EXECUTION SECTION-" & ex.Message,
                                  "SQL CMD EXECUTION", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Exit Sub
    End Try

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

1 Ответ

0 голосов
/ 11 апреля 2020

Я не уверен, что полностью понял вашу проблему, но ваша проблема может заключаться в том, что datagridview генерирует столбцы автоматически. См .: DataGridView.AutoGenerateColumns

Вместо того, чтобы делать SELECT * FROM, лучше выбрать только те поля, которые вам нужны. Если в будущем вы добавите больше полей в таблицу, столбцы в сетке данных могут быть смещены, поскольку они не в определенном порядке.

Вместо добавления таблицы данных в форму во время выполнения:

EMPLOYEE_DEL_FRM.Controls.Add(OBJECT_DATAGRIDVIEW)

Я бы добавил его непосредственно в макет формы (чтобы вы могли видеть его во время разработки), а затем настроил его, привязав каждый столбец к полю базы данных. Внешний вид сетки будет более предсказуемым. Вот небольшое руководство: Как связать datatable / list с сеткой данных с заголовками? Использование AutoGenerateColumns не очень хорошая идея, потому что это покажет все столбцы (обычно нежелательно) и не обязательно в Порядок, который вы хотите.

Другие замечания:

Записи могут быть отредактированы или удалены непосредственно в виде сетки данных, просто выбрав одну или несколько строк и нажав клавишу Del. Затем просто вызовите DataAdapter, чтобы зафиксировать изменения в базе данных. Вы не должны даже делать DELETE FROM. Просто позвольте пользователю использовать datagridview. Преимущество состоит в том, что если пользователь допустил ошибку, вы можете откатить изменения, потому что вы используете данные. Здесь вы удаляете сразу и без предупреждения.


Не делайте такие вещи, как:

  SQL_CMD_TXT = "DELETE FROM `employees` WHERE (`EMPLOYEE_ID` ='" &
            EMPLOYEE_DEL_FRM.DEL_ID_TXT.Text & "');  SELECT * FROM `employees`;"

Используйте параметризованные запросы вместо , этот код небезопасно и может подавиться одинарными кавычками или специальными символами (попробуйте!). Вот простой пример: FAQ: Как сделать параметризованный запрос в базе данных с помощью VB. NET? . Пожалуйста, используйте параметризованные запросы с этого момента, не развивайте вредных привычек , которые всегда будут кусать вас рано или поздно. Один только риск безопасности слишком высок.


Также мне интересно, почему вы сделали сложенных запросов . Было бы лучше отделить SELECT от DELETE.


В этом коде переменная sql не нужна:

With cmd
    sql = SQL_CMD_TXT
    .Connection = con
    .CommandText = sql
End With

Просто используйте SQL_CMD_TXT напрямую. В противном случае это усложнит выполнение кода.

...