studio primary last inserted example autoincrement auto_increment _id database sqlite primary-key auto-increment junction-table

database - primary - sqlite studio autoincrement



¿Cómo recuperar el último ID autoincrementado de una tabla SQLite? (4)

Código de muestra de la solución @polyglot

SQLiteCommand sql_cmd; sql_cmd.CommandText = "select seq from sqlite_sequence where name=''myTable''; "; int newId = Convert.ToInt32( sql_cmd.ExecuteScalar( ) );

Tengo una tabla Mensajes con ID de columna (clave principal, autoincremento) y Contenido (texto).
Tengo una tabla Usuarios con columnas nombre de usuario (clave principal, texto) y Hash.
Un remitente (usuario) envía un mensaje a muchos destinatarios (usuario) y un destinatario (usuario) puede tener muchos mensajes.
Creé una tabla Messages_Recipients con dos columnas: MessageID (haciendo referencia a la columna ID de la tabla Mensajes y Destinatario (haciendo referencia a la columna de nombre de usuario en la tabla Usuarios). Esta tabla representa la relación de muchos a muchos entre destinatarios y mensajes.

Entonces, la pregunta que tengo es esto. El ID de un mensaje nuevo se creará después de haber sido almacenado en la base de datos. Pero, ¿cómo puedo mantener una referencia al MessageRow que acabo de agregar para recuperar este nuevo MessageID?
Siempre puedo buscar en la base de datos la última fila añadida, pero ¿podría devolver una fila diferente en un entorno multiproceso?

EDITAR: como lo entiendo para SQLite, puede usar SELECT last_insert_rowid (). Pero, ¿cómo puedo llamar a esta declaración de ADO.Net?

Mi código de Persistence (mensajes y mensajesRecipientes son DataTables):

public void Persist(Message message) { pm_databaseDataSet.MessagesRow messagerow; messagerow=messages.AddMessagesRow(message.Sender, message.TimeSent.ToFileTime(), message.Content, message.TimeCreated.ToFileTime()); UpdateMessages(); var x = messagerow;//I hoped the messagerow would hold a //reference to the new row in the Messages table, but it does not. foreach (var recipient in message.Recipients) { var row = messagesRecipients.NewMessages_RecipientsRow(); row.Recipient = recipient; //row.MessageID= How do I find this?? messagesRecipients.AddMessages_RecipientsRow(row); UpdateMessagesRecipients();//method not shown } } private void UpdateMessages() { messagesAdapter.Update(messages); messagesAdapter.Fill(messages); }


Con SQL Server SELECCIONARÍA SCOPE_IDENTITY () para obtener el último valor de identidad para el proceso actual.

Con SQlite, parece una autoincrementación que harías

SELECT last_insert_rowid()

inmediatamente después de su inserción.

http://www.mail-archive.com/[email protected]/msg09429.html

En respuesta a su comentario para obtener este valor, querrá usar código SQL o OleDb como:

using (SqlConnection conn = new SqlConnection(connString)) { string sql = "SELECT last_insert_rowid()"; SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); int lastID = (Int32) cmd.ExecuteScalar(); }


Otra opción es mirar la tabla del sistema sqlite_sequence . Su base de datos sqlite tendrá esa tabla automáticamente si creó cualquier tabla con la clave primaria autoincrement. Esta tabla es para que sqlite realice un seguimiento del campo de autoincrement para que no repita la clave principal incluso después de eliminar algunas filas o después de que haya fallado alguna inserción (lea más sobre esto aquí http://www.sqlite.org/autoinc.html ).

Por lo tanto, con esta tabla existe la ventaja adicional de que puede encontrar la clave principal de su elemento recién insertado incluso después de haber insertado algo más (¡en otras tablas, por supuesto!). Después de asegurarse de que su inserción sea exitosa (de lo contrario obtendrá un número falso), simplemente necesita hacer:

select seq from sqlite_sequence where name="table_name"


Tuve problemas con el uso de SELECT last_insert_rowid() en un entorno multiproceso. Si otro hilo se inserta en otra tabla que tiene un autoinc, last_insert_rowid devolverá el valor autoinc de la nueva tabla.

Aquí es donde dicen que en el doco:

Si un subproceso independiente realiza un nuevo INSERT en la misma conexión de base de datos mientras se está ejecutando la función sqlite3_last_insert_rowid () y cambia el último insert rowid, entonces el valor devuelto por sqlite3_last_insert_rowid () es impredecible y puede no ser el anterior o el último nuevo insertar rowid.

Eso es de sqlite.org doco