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