Vb.Net получает последнее значение автоматического увеличения в таблице данных

Я загружаю данные из базы данных доступа из таблицы имен автомобилей с данными. Эта таблица имеет carId как номер автоматического увеличениявведите здесь описание изображения

загрузка данных таким образом:

Private Sub frmCar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
        dsDataSet = New DataSet
        loadCars()

        bsCar = New BindingSource(dsDataSet, "car")

        CarIDTextBox.DataBindings.Add(New Binding("text", bsCar, "carId"))
        BrandTextBox.DataBindings.Add(New Binding("text", bsCar, "brand"))
        ModelTextBox.DataBindings.Add(New Binding("text", bsCar, "model"))
        RegNoTextBox.DataBindings.Add(New Binding("text", bsCar, "regNo"))
        InsIDTextBox.DataBindings.Add(New Binding("text", bsCar, "insId"))
        DailyChargeTextBox.DataBindings.Add(New Binding("text", bsCar, "dailyCharge"))
        WeeklyChargeTextBox.DataBindings.Add(New Binding("text", bsCar, "weeklyCharge"))
        MonthlyChargeTextBox.DataBindings.Add(New Binding("text", bsCar, "monthlyCharge"))
        YearlyChargeTextBox.DataBindings.Add(New Binding("text", bsCar, "yearlyCharge"))
        TransmissionTextBox.DataBindings.Add(New Binding("text", bsCar, "transmission"))
        ColorTextBox.DataBindings.Add(New Binding("text", bsCar, "color"))
        RemarkTextBox.DataBindings.Add(New Binding("text", bsCar, "remark"))


    Catch ex As Exception
        MsgBox(Err.Description)
    End Try
End Sub

Sub loadCars()
    Dim sql As String

    Try
        oledbConn = New OleDbConnection(oledbConnString)
        oledbConn.Open()

        sql = "select * from car order by carId"
        daCar = New OleDbDataAdapter(sql, oledbConn)
        daCar.Fill(dsDataSet, "car")
        '----------------------------------------------------------------------

        oledbConn.Close()
    Catch ex As Exception
        oledbConn.Close()
        MsgBox(Err.Description)
    End Try
End Sub

Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNew.Click
    Try
        bsCar.AddNew()

    Catch ex As Exception
        MsgBox(Err.Description)
    End Try
End Sub

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    Try
        Me.Validate()
        bsCar.EndEdit()
        daCar.Update(dsDataSet.Tables("car"))
        MsgBox("Car saved successfully")
    Catch ex As Exception
        MsgBox(Err.Description)
    End Try
End Sub

Теперь, когда я добавляю новую машину и сохраняю ее, все работает идеально. Но мне нужно, чтобы carId добавленного нового автомобиля отображался сразу после добавления. Как я могу это сделать, не запрашивая базу данных? Спасибо


person Hilal Al-Rajhi    schedule 14.02.2014    source источник
comment
Без запроса к базе данных? Вы не можете (по крайней мере, с доступом).   -  person Steve    schedule 14.02.2014
comment
Как сказал Стив, с Access вам нужно будет снова запросить БД. В основном отправьте запрос для выбора идентификатора автомобиля, где regNo = regNo, который вы только что добавили. На заднем сайте, поскольку regNo будет уникальным (если вы не переносите номерные знаки с машины на машину), тогда regNo может быть первичным ключом, и вам не понадобится поле AutoNumber.   -  person Mych    schedule 14.02.2014
comment
Access поддерживает SELECT @@IDENTITY для получения последнего сгенерированного автоинкремента, но проблема здесь заключается в команде Adapter.Update, которая не дает нам открытого соединения для работы. Нужно сделать тест   -  person Steve    schedule 14.02.2014
comment
Это очень полезные заметки. Я думаю, что решение мистера Стива проясняет ситуацию. Спасибо   -  person Hilal Al-Rajhi    schedule 15.02.2014


Ответы (1)


Кажется, есть способ получить значение AutoIncrement из базы данных во время выполнения метода Update, но нет способа избежать другого запроса к базе данных.
Вы можете использовать RowUpdated, вызванное событием OleDbDataAdapter после того, как строка была обновлена ​​(или вставлена).

Нам нужно использовать команду «SELECT @@IDENTITY», поддерживаемую Access, но это не может быть эффективным, если мы не работаем с тем же соединением, которое используется обновлением, поэтому единственный вариант — использовать событие RowUpdated, когда соединение все еще открыть

' Need to have a OleDbCommandBuilder to build the InsertCommand for the OleDbDataAdapter
Sub loadCars()
    ....
    daCar = New OleDbDataAdapter(sql, oledbConn)
    Dim builder = new OleDbCommandBuilder(daCar)
    daCar.InsertCommand = builder.GetInsertCommand
    daCar.Fill(dsDataSet, "car")
End Sub


' In the update code
AddHandler daCar.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf NewRowInserted)
daCar.Update(dsDataSet.Tables("car"))

' The event handler is called for any row inserted, updated or deleted
Sub NewRowInserted(sender as Object, e as OleDb.OleDbRowUpdatedEventArgs)

    ' Check if we are working for a row with the proper state
    If e.Row.RowState = DataRowState.Added Then
       Dim cmd = new OleDbCommand("SELECT @@IDENTITY",e.Command.Connection)
       Dim newID = DirectCast(cmd.ExecuteScalar(), Integer)
       Console.WriteLine(newID)
    End If
End Sub
person Steve    schedule 14.02.2014
comment
Но еще один момент: могу ли я использовать AddHandler daCar.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf NewRowInserted) для более чем одного адаптера? - person Hilal Al-Rajhi; 15.02.2014