У вас нет 2 SqlCommands.
У вас есть 1 SqlCommand, называемый cmd
, который выполняется несколько раз.
Можно сделать что-то подобное, однако ябудет иметь 1 SqlCommand для вашего INSERT INTO record
и 1 для вашего INSERT INTO record_item
.Я думаю, что это облегчает понимание, если оглянуться на код позже.
В любом случае, использование такой SqlCommand не должно помешать ее выполнению, поэтому я считаю, что есть еще одна проблема с вашимсценариев.
Я адаптировал ваш код так, чтобы он был разбит на 2 отдельных объекта SqlCommand, а запросы были параметризованы для предотвращения SQL-инъекций:
Dim conn As New SqlConnection("Database=Clinic_Management_System;Data Source=.\SQLExpress;Integrated Security=True;AttachDBFilename=|DataDirectory|Clinic Management System.mdf")
Dim cmdRecord As New SqlCommand("INSERT INTO record ([PatientID],[Prescription],[VisitDate]) Values (@PatientID, @Prescription, GETDATE())", conn)
cmdRecord.Parameters.Add("@PatientID", SqlDbType.Int).Value = PatientIDTextBox.Text
cmdRecord.Parameters.Add("@Prescription", SqlDbType.NVarChar).Value = txtPrescription.Text
Dim cmdRecordItem As New SqlCommand("INSERT INTO record_item([RecordID],[ItemID],[Amount]) Values ( (SELECT MAX(RecordID) FROM record),@ItemID,@AmountID)", conn)
cmdRecordItem.Parameters.Add("@ItemID", SqlDbType.Int)
cmdRecordItem.Parameters.Add("@Amount", SqlDbType.Decimal)
Dim dr As SqlDataReader
conn.Open()
cmdRecord.ExecuteNonQuery()
For cn As Integer = 0 To DataGridView1.RowCount - 1
cmdRecordItem.Parameters("@ItemID").Value = DataGridView1.Rows(cn).Cells(0).Value
cmdRecordItem.Parameters("@Amount").Value = DataGridView1.Rows(cn).Cells(2).Value
cmdRecordItem.ExecuteNonQuery()
Next
conn.Close()