Paul Williams
Paul Williams

Reputation: 1598

Retrieving @@IDENTITY in AccessDB

I'm trying to retrieve the @@IDENTITY value from an access database after I add a row to it. However, instead of using hard coded connections, I'm using the DataSet wizard. Unfortunately, due to the Jet engine, I can't do more than one command at a time. I tried to select the @@IDENTITY in a separate command but unfortunately, I guess it counts as a different command as it returns a 0 each time.

My question is, is there a way I can use the GUI/IDE to retrieve the @@IDENTITY or do I have hard code the connection, command, query values and obtain the value that way.

Thanks.

Upvotes: 1

Views: 185

Answers (1)

Philip Fourie
Philip Fourie

Reputation: 116837

You asked an interesting questions which I did not know the answer to. After some research I found this and it seems promising. However I have never used it and cannot substantiate if and how well it works.

I also don't know the DataSet wizard that well, but vaguely recalls that it generates an OleDbAdapter object, hopefully it exposes a RowUpdated event which you can hook this code to.

I have pasted the interesting MSDN code parts here: (Link to full documentation)

    ' Create the INSERT command for the new category.
    adapter.InsertCommand = New OleDbCommand( _
      "INSERT INTO Categories (CategoryName) Values(?)", connection)
    adapter.InsertCommand.CommandType = CommandType.Text

Then hook-up and event listener to RowUpdated

    ' Include an event to fill in the Autonumber value.
    AddHandler adapter.RowUpdated, _
      New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)

Obtain the @@Identity with the same connection.

Private Shared Sub OnRowUpdated( _
    ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs)
    ' Conditionally execute this code block on inserts only.
    If e.StatementType = StatementType.Insert Then
        ' Retrieve the Autonumber and store it in the CategoryID column.
        Dim cmdNewID As New OleDbCommand("SELECT @@IDENTITY", _
           connection)
        e.Row("CategoryID") = CInt(cmdNewID.ExecuteScalar)
        e.Status = UpdateStatus.SkipCurrentRow
    End If
End Sub

Hopefully this helps you out or least someone will set me straight :)

Upvotes: 1

Related Questions