Comment récupérer le dernier auto-incrément avec SQlite et Mono ?

J’ai toujours trouvé un peu étrange que chaque base de données gère la récupération du dernier auto-incrément (@@IDENTITY) à sa manière.
Encore plus étrange, j’aurais escompté qu’ADO.Net par exemple, unifie le processus. Mais ce n’est pas le cas et j’imagine qu’il y a de bonnes raisons pour cela.

Toujours est-il que si vous vous demandez comment récupérer le dernier auto-incrément inséré en utilisant l’extension Mono.Data.SqliteClient, voici la marche à suivre.
La class Mono.Data.SqliteConnection inclue la propriété LastInsertRowId, qui contient la valeur recherchée

Ce qui donne quelque chose comme (en BOO) :

import Mono.Data.SqliteClient
 
cnx = SqliteConnection("URI=file:sqliteDb.db")
cmd = SqliteCommand("INSERT INTO my_table (field) VALUES ('value')", cnx)
 
cnx.Open()
cmd.ExecuteNonQuery()
inserted_id = cnx.LastInsertRowId
cnx.Close()
    • Julien
    • 4 août 2009

    In my opinion, the reason why ADO.Net does not allow to retrieve the last inserted id through the same way is to avoid data corruption by working on the wrong row. Of course, it depends the needs but I would tend to work on the returned @@IDENTITY by a simple ExecuteScalar. Something like this in C# for MsSql:

    cmd = new SqlCommand(« INSERT INTO my_table (field) VALUES (‘value’);SELECT @@IDENTITY; », cnx);
    [...]
    inserted_id = (int)cmd.ExecuteScalar();

    In BOO and for SQlite, it should be like this:

    cmd = SqliteCommand(« INSERT INTO my_table (field) VALUES (‘value’);SELECT last_insert_rowid(); », cnx)
    [...]
    inserted_id = cmd.ExecuteScalar() as (int)

  1. Aucun trackback pour l'instant