Как вставить несколько строк из datagridview в базу данных SQL в VB.net? - PullRequest
0 голосов
/ 17 ноября 2018

Я сделал форму с именем form1.vb.
У меня есть 4 текстовых поля с именами supid, supname, supmobile, suploc.
У меня есть DataGridView с именем datagridview1.
Я передаю эти 4 данных TextBoxes в DataGridView, но когда я пытаюсь отправить строку DataGridView в базу данных SQL, он отправляет только 1 строку.

Я хочу, чтобы сразу несколько строк вставлялись в SQL-сервер при нажатии кнопки вставки.
Есть много учебников по языку C, но нет учебника по VB.Net.
Помогите пожалуйста как это сделать в VB.Net.

Мой код:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    If TextBox2.Text = "" Or TextBox3.Text = "" Or TextBox4.Text = "" Then
        MessageBox.Show("PLEASE FILL ALL FIELDS")
    Else
        connection.Open()
        Dim thequery As String = "select*from supplierdata where supmobile = @supmobile"
        Dim cmd1 As SqlCommand = New SqlCommand(thequery, connection)
        cmd1.Parameters.AddWithValue("@supmobile", TextBox3.Text)

        Dim reader As SqlDataReader = cmd1.ExecuteReader()

        If reader.HasRows Then
            MessageBox.Show("MOBILE NO IS ALREADY REGISTERED")
        Else
            reader.Close()
            command = New SqlCommand("INSERT INTO supplierdata VALUES (@supid,@supname,@supmobile,@suploc)", connection)
            Dim i As Integer = 0
            For Each row As DataGridViewRow In DataGridView1.Rows
                command.Parameters.Add("supid", SqlDbType.Int).Value = DataGridView1.Rows(i).Cells(0).value
                command.Parameters.Add("supname", SqlDbType.NChar).Value = DataGridView1.Rows(i).Cells(1).Value
                command.Parameters.Add("supmobile", SqlDbType.NChar).Value = DataGridView1.Rows(i).Cells(2).Value
                command.Parameters.Add("suploc", SqlDbType.NChar).Value = DataGridView1.Rows(i).Cells(3).Value

                i = command.ExecuteNonQuery()
            Next

            MessageBox.Show("CUSTOMER REGISTERED SUCCESFULLY")
            connection.Close()
            command.Dispose()
        End If
    End If
End Sub

1 Ответ

0 голосов
/ 17 ноября 2018
  1. в вашем первом операторе If используйте OrElse вместо Or.Это остановит оценку, как только будет обнаружен True.
  2. Держите ваши соединения локальными.Они должны быть открыты в последнюю минуту, закрыты и утилизированы как можно скорее.Блок Using...End Using позаботится об этом.
  3. Если все, что вам нужно, это счет, то попросите только счет.Не извлекайте данные, которые вы не используете.Нет DataReader необходимо.Просто используйте ExecuteScalar.
  4. Хорошая работа с использованием параметров!
  5. Имена ваших параметров, которые вы используете в запросе Sql, должны совпадать с вашими именами при добавлении параметров.(Не верно для Access, где порядок добавления параметров является единственным, что имеет значение.)
  6. Теперь к реальной проблеме Dim i As Integer = 0 Затем вы используете DataGridView1.Rows(i).Cells(0).Value в цикле For Each.Строка всегда является первой строкой, и она никогда не изменяется в вашем цикле.Вот почему «он отправляет только 1 строку»
  7. Вы не хотите продолжать добавлять параметры в цикле For Each.
  8. Еще одна вещь - если subid - это автостолбец приращения не отправляет никаких данных для этого столбца.

Не проверенный код.У меня нет вашей формы или вашей базы данных.

Private Sub OPCode2()
    If TextBox2.Text = "" OrElse TextBox3.Text = "" OrElse TextBox4.Text = "" Then
        MessageBox.Show("PLEASE FILL ALL FIELDS")
        Return
    End If
    Dim count As Integer
    Try
        Using cn As New SqlConnection("Your connection string")
            Dim thequery As String = "select Count(*) from supplierdata where supmobile = @supmobile;"
            Using cmd1 As SqlCommand = New SqlCommand(thequery, cn)
                cmd1.Parameters.AddWithValue("@supmobile", TextBox3.Text)
                cn.Open()
                count = CInt(cmd1.ExecuteScalar())
            End Using
        End Using
    Catch ex As Exception 'You probably want to catch more specific exceptions
        'and handle them separately
        MessageBox.Show(ex.Message)
    End Try
    If count > 0 Then
        MessageBox.Show("MOBILE NO IS ALREADY REGISTERED")
        Return
    End If
    Try
        Using cn As New SqlConnection("Your connection string")
            Using cmd2 As New SqlCommand("INSERT INTO supplierdata (supid,supname,supmobile,suploc)VALUES (@supid,@supname,@supmobile,@suploc)", cn)
                cmd2.Parameters.Add("@supid", SqlDbType.Int)
                cmd2.Parameters.Add("@supname", SqlDbType.NChar)
                cmd2.Parameters.Add("@supmobile", SqlDbType.NChar)
                cmd2.Parameters.Add("@suploc", SqlDbType.NChar)
                cn.Open()
                For Each row As DataGridViewRow In DataGridView1.Rows
                    With cmd2
                        .Parameters("@supid").Value = row.Cells(0).Value
                        .Parameters("@supname").Value = row.Cells(1).Value
                        .Parameters("@supmobile").Value = row.Cells(2).Value
                        .Parameters("@suploc").Value = row.Cells(3).Value
                    End With
                    cmd2.ExecuteNonQuery()
                Next
            End Using 'You probably want to catch more specific exceptions
            'and handle them separately
        End Using
    Catch ex As Exception 'You probably want to catch more specific exceptions
        'and handle them separately
        MessageBox.Show(ex.Message)
    End Try
    MessageBox.Show("CUSTOMER REGISTERED SUCCESFULLY")
End Sub

РЕДАКТИРОВАТЬ Если supid - столбец с автоинкрементом, удалите его из параметров.Измените запрос вставки на "INSERT INTO supplierdata (supname,supmobile,suploc)VALUES (@supname,@supmobile,@suploc)" Затем вам нужно удалить строки cmd2.Parameters.Add("@supid", SqlDbType.Int) и .Parameters("@supid").Value = row.Cells(0).Value. Делать это только в том случае, если supid и автоинкремент (столбец идентификаторов)

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