web-dev-qa-db-fra.com

Obtenir le dernier ID d'insertion avec SQLite.NET en C #

J'ai un problème simple avec une solution pas si simple ... J'insère actuellement des données dans une base de données comme celle-ci:

                kompenzacijeDataSet.KompenzacijeRow kompenzacija = kompenzacijeDataSet.Kompenzacije.NewKompenzacijeRow();
                kompenzacija.Datum = DateTime.Now;
                kompenzacija.PodjetjeID = stranka.id;
                kompenzacija.Znesek = Decimal.Parse(tbZnesek.Text);

                kompenzacijeDataSet.Kompenzacije.Rows.Add(kompenzacija);

                kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter kompTA = new kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter();
                kompTA.Update(this.kompenzacijeDataSet.Kompenzacije);

                this.currentKompenzacijaID = LastInsertID(kompTA.Connection);

La dernière ligne est importante. Pourquoi est-ce que je fournis une connexion? Il existe une fonction SQLite appelée last_insert_rowid () que vous pouvez appeler et obtenir le dernier ID d’insertion. Le problème est qu’il est lié à une connexion et .NET semble réouvrir et fermer des connexions pour chaque opération de jeu de données. Je pensais qu'obtenir la connexion d'un adaptateur de table changerait les choses. Mais ce n'est pas le cas.

Quelqu'un saurait-il comment résoudre ce problème? Peut-être où obtenir une connexion constante? Ou peut-être quelque chose de plus élégant? 

Je vous remercie.

MODIFIER: 

C'est aussi un problème avec les transactions, j'aurais besoin de la même connexion si je voulais utiliser des transactions, donc c'est aussi un problème ... 

20
vanneto
select last_insert_rowid();

Et vous devrez l'exécuter comme une requête scalaire.

string sql = @"select last_insert_rowid()";
long lastId = (long)command.ExecuteScalar(sql); // Need to type-cast since `ExecuteScalar` returns an object.
45
Will Marcouiller

En utilisant C # (.net 4.0) avec SQLite, la classe SQLiteConnection a une propriété LastInsertRowId qui est égale à la clé primaire entière du dernier élément inséré (ou mis à jour).

Le rowID est renvoyé si la table n'a pas de clé entière primaire (dans ce cas, le rowID est que la colonne est créée automatiquement). 

Voir https://www.sqlite.org/c3ref/last_insert_rowid.html pour plus d'informations.

En ce qui concerne le regroupement de plusieurs commandes dans une seule transaction, toutes les commandes entrées après le début de la transaction et avant qu’elle ne soit validée font partie d’une transaction.

long rowID;
using (SQLiteConnection con = new SQLiteConnection([datasource])
{
    SQLiteTransaction transaction = null;
    transaction = con.BeginTransaction();

    ... [execute insert statement]

    rowID = con.LastInsertRowId;

    transaction.Commit()
}
54
Alex Smith

last_insert_rowid () fait partie de la solution. Il renvoie un numéro de ligne, pas l'ID réel.

cmd = CNN.CreateCommand();
cmd.CommandText = "SELECT last_insert_rowid()";
object i = cmd.ExecuteScalar();

cmd.CommandText = "SELECT " + ID_Name + " FROM " + TableName + " WHERE rowid=" + i.ToString();
i = cmd.ExecuteScalar();
7
Greg Carrier
    database = new SQLiteConnection(databasePath);

    public int GetLastInsertId()
    {
        return (int)SQLite3.LastInsertRowid(database.Handle);
    }
1

L'objet SQLiteConnection possède une propriété à cet effet, il n'est donc pas nécessaire de recourir à une requête supplémentaire. Après INSERT, vous n'utilisez que la propriété LastInsertRowId de votre SQLiteConnection objet utilisé pour la commande INSERT. Type de LastInsertRowId la propriété est Int64 . Bien sûr, comme vous l'avez déjà fait, pour que l'incrémentation automatique fonctionne, la clé primaire de la table doit être définie surAUTOINCREMENTfield, qui est un autre sujet.

0
stonito