#sql #vb.net
#sql #vb.net
Вопрос:
У меня возникли некоторые проблемы с запуском запроса на основе другого запроса. Вот схема базы данных, дающая небольшую информацию. Первичные ключи для всех таблиц автоматически генерируются идентификаторами. Первые 2 оператора insert (Donation и Food_Donation) работают, но я не могу заставить работать последнюю вставку в Donation_Details. Вот код на данный момент:
Dim con As New OleDbConnection(DBcon)
Try
Dim dr As OleDbDataReader
Dim command As New OleDbCommand("Insert into Donation (Donor_ID) VALUES ( " amp; txtDonNum.Text amp; "); Select @@Identity;")
con.Open()
command.Connection = con
dr = command.ExecuteReader
Dim Donation_ID As String = ""
If dr.Read() Then
Donation_ID = dr(0).ToString
Dim food As New OleDbCommand("Insert into Food_Donation (Date_Received, Donation_ID) Values ( '" amp; maskedreceived.Text amp; "', " amp; Donation_ID amp; "); Select @@Identity")
food.Connection = con
food.ExecuteNonQuery()
End If
Dim Food_ID As String = ""
If dr.Read() Then
Food_ID = dr(0).ToString
Dim food2 As New OleDbCommand("Insert into Donation_Details (Quantity, Unit, Expiration_Date, Food_ID, Storage_ID, Type_ID) Values ( " amp; txtQuantity.Text amp; ", '" amp; boxUnit.Text amp; "', '" amp; maskedexpire.Text amp; "', " amp; Food_ID amp; ", " amp; txtStorageID.Text amp; ", " amp; txtTypeID.Text amp; ")")
food2.Connection = con
food2.ExecuteNonQuery()
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End sub
Я совершенно прав, мои операторы SQL верны, и дело только в том, должны ли последние операторы быть If или чем-то еще.
Комментарии:
1. Таблицы Little Bobby могли бы гордиться. xkcd.com/327 . Вы должны использовать параметризованные запросы.
Ответ №1:
Вы должны использовать dr = food.ExecuteReader()
вместо food.ExecuteNonQuery()
, если хотите повторно использовать dr для получения Food_ID
?
Ответ №2:
Я подозреваю, что ваша проблема в том, что вы используете If dr.Read()
дважды.
dr.Read()
Метод переместит средство чтения вперед к следующей строке, но вы выбираете только одно значение в своем первоначальном запросе.
Так, например, ваш reader (созданный на основе insert) вернет значение одной строки для успешной вставки. Вызов Read()
для него завершится успешно, но затем переместите курсор строки на, EOF
вызывая возврат последующих Read()
вызовов FALSE