2010-12-02 13 views
17

que tienen un problema sencillo con una solución no es tan simple ... Estoy insertando actualmente algunos datos en una base de datos de esta manera:Obtener la última inserción de identificación con SQLite.NET en C#

   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 última línea es importante. ¿Por qué proporciono una conexión? Bueno, hay una función SQLite llamada last_insert_rowid() a la que puede llamar y obtener la última ID de inserción. El problema es que está vinculado a una conexión y parece que .NET está reabriendo y cerrando conexiones para cada operación de conjunto de datos. Pensé que obtener la conexión de un adaptador de mesa cambiaría las cosas. Pero no es así

¿Alguien sabe cómo solucionar esto? ¿Tal vez de dónde obtener una conexión constante? O tal vez algo más elegante?

Gracias.

EDIT:

Este es también un problema con las transacciones, necesitaría la misma conexión si se desea utilizar transacciones, por lo que es también un problema ...

Respuesta

43
select last_insert_rowid(); 

Y usted necesitará ejecutarlo como una consulta escalar.

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

rowid sea echado a Int64: 'var resultado = (Int64) command.ExecuteScalar (sql);' – Johnny

+7

El tipo 'valor long' ya es un' Int64'. –

+0

Encontré que esta respuesta no funciona. La siguiente respuesta (por Alex Smith) funciona. – ttom

7

last_insert_rowid() es parte de la solución. Devuelve un número de fila, no la identificación real.

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(); 
41

con C# (.NET 4.0) con SQLite, la clase SQLiteConnection tiene una propiedad LastInsertRowId que es igual al número entero Clave principal del elemento más recientemente insertado (o actualizado).

rowID se devuelve si la tabla no tiene una clave entera primaria (en este caso rowID es la columna se crea automáticamente).

Ver https://www.sqlite.org/c3ref/last_insert_rowid.html para más.

En cuanto a envolver varios comandos en una sola transacción, los comandos ingresados ​​después de la transacción y antes de que se cometan son parte de una transacción.

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

    ... [execute insert statement] 

    rowID = con.LastInsertRowId; 

    transaction.Commit() 
} 
+3

Esto necesita más votos positivos. Es la manera de buscar aplicaciones más nuevas por lo que veo. –

+0

Esta respuesta funciona. La otra respuesta no. – ttom

0

El SQLiteConnection objeto tiene una propiedad para eso, por lo que no hay necesidad de consulta adicional. Después de INSERTAR usted acaba de usar LastInsertRowId propiedad de su objeto SQLiteConnection que se utilizó para el comando INSERTAR. Tipo de LastInsertRowId La propiedad es Int64. Por supuesto, como ya lo hace ahora, para que el incremento automático funcione, la clave primaria en la tabla debe establecerse en campo AUTOINCREMENT, que es otro tema.

0
database = new SQLiteConnection(databasePath); 

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

lo siento, es un trabajo para sqlite-net-pcl –

+0

bueno, gracias por esto: P –

Cuestiones relacionadas