Несколько операторов if, тогда или иначе?

#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