Access Recuperare nel DataSet la Chiave autonumber generata dal database

Con ADO e DAO il recupero dell'ultima chiave autonumber inserita su una tabella di Access poteva avvenire direttamente "builtin nel motore" tramite il recordset connesso oppure mediante l'istruzione SELECT @@IDENTITY data sulla stessa connessione aperta che aveva fatto il comando sql "INSERT INTO".

Con l'avvento di ADO.NET, visto che sostanzialmente è  una gestione dei dati disconnessa, dei due metodi è rimasto solo il secondo.

Su ciascuna tabella locale mappata nel DataSet agisce un particolare DataAdapter (un DataAdapter per tabella ovviamente!).
Su ciascun DataAdapter automaticamente (dal CommandBuilder) o manualmente (dal programmatore) sono impostati i relativi 4 comandi sql possibili Insert, Update, Delete, Select.

Ciascuno dei comandi ha i propri parametri, la propria definizione di connessione ed i propri attributi.

L'evento Update del DataTable fa in modo che per ciascuna riga Inserita/Variata/Cancellata sia eseguito il comando corrispondente del DataAdapter.

Pertanto se vogliamo recuperare il progressivo autonumber utilizzato dobbiamo intervenire proprio nel punto DOPO l'aggiornamento della riga sul database ma PRIMA della riga successiva.

ADO.NET ci viene incontro appunto mettendoci a disposizione un evento: OleDbOnRowUpdatedEvent che possiamo collegare ed aggiungere al nostro DataAdapter.

VB.NET
 
Dim oleDbDataAdapter1 As OleDbDataAdapter
Dim ColumnName As String = "ID"
...
AddHandler oleDbDataAdapter1.RowUpdated, AddressOf OnRowUpdated

C#
OleDbDataAdapter oleDbDataAdapter;
string ColumnName = "ID";
oleDbDataAdapter1.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated);

A cui naturalmente dobbiamo anche inserire nel nostro programma il gestore dell'evento con l'operazione vera e propria:

VB.NET 

Private Sub OnRowUpdated(ByVal Sender As Object, ByVal args As OleDbRowUpdatedEventArgs)
    ' solo righe inserite
    If args.StatementType = StatementType.Insert Then
       Dim cmd As OleDbCommand = New OleDbCommand ("SELECT@@IDENTITY",oleDbDataAdapter1.SelectCommand.Connection)
     'aggiornamento della tabella locale
      args.Row(ColumnName) = CType(cmd.ExecuteScalar, Integer)
    End If
End Sub

C#

private void OnRowUpdated(object Sender, OleDbRowUpdatedEventArgs args)
{
    // test per vedere se si tratta di un nuovo inserimento
    if(args.StatementType == StatementType.Insert)
    {
        // Recupero dell'ultimo numero inserito
        OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY",
            oleDbDataAdapter1.SelectCommand.Connection);
        // Aggiornamento della tabella locale
        args.Row[ColumnName] = (int)cmd.ExecuteScalar( );
    }
}

Print | posted on martedì 26 luglio 2005 16:48

Feedback

# @@Identity - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 27/11/2007 19:13
Gravatar @@Identity - MasterDrive.it - Information Technology Developers Community

# @@Identity - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 28/11/2007 13:09
Gravatar @@Identity - MasterDrive.it - Information Technology Developers Community

# Aggiornamento Dataset | hilpers

Left by Pingback/TrackBack at 21/01/2009 21:12
Gravatar Aggiornamento Dataset | hilpers

#  Salvare dati su db da datagridview - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 29/09/2009 03:26
Gravatar Salvare dati su db da datagridview - MasterDrive.it - Information Technology Developers Community

#  Refresh DataGrid - Visual Basic .Net - MasterDrive.it

Left by Pingback/TrackBack at 28/01/2010 08:20
Gravatar Refresh DataGrid - Visual Basic .Net - MasterDrive.it

#  Database vb2008 - Visual Basic .Net - MasterDrive.it

Left by Pingback/TrackBack at 25/03/2010 04:12
Gravatar Database vb2008 - Visual Basic .Net - MasterDrive.it

Your comment:





 
Please add 2 and 8 and type the answer here:

Copyright © Luciano Bastianello

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski