2009-02-10 9 views
9

Tengo una tabla en SQLite:Cómo devolver el valor de la columna de incremento automático en SQLite con VB6

CREATE TABLE "EventType" 
(
[EventTypeID] INTEGER PRIMARY KEY, 
[EventTypeName] VARCHAR(50) NOT NULL UNIQUE 
); 

Desde EventTypeID es un entero y una clave principal, que hace automáticamente una columna de incremento automático, y eso funciona bien

Me gustaría insertar una fila en la tabla y obtener el valor recién incrementado de VB6.

Dim oRs as Recordset 
dim oCmd as new Command 

oCmd.ActiveConnection = GetConnection() 
oCmd.Source = "insert into EventType (EventTypeName) values ('blah')" 
oCmd.Execute 

¿Hay una manera automática para recuperar el EventTypeID recién creado sin tener que emitir otra consulta (select max (EventTypeID) de EventType))?

Me parece recordar desde VB6 días hace mucho tiempo, que había una manera de hacerlo.

+0

Posible duplicado de [? ¿Son compatibles con SQLite ALCANCE \ _IDENTITY] (http://stackoverflow.com/questions/304543/does-sqlite-support-scope-identity) –

Respuesta

14

Does SQLite support SCOPE_IDENTITY?

Mira la FAQ. La función sqlite3_last_insert_rowid() lo hará. Cuidado con activadores aunque

No probado, pero debe poder enviar ambas declaraciones en una sola llamada. Ha pasado un tiempo desde que escribí cualquier VB6. Además, esto no es seguro para inyección SQL.

Dim oRs as Recordset 
dim sSql as String 
sSql = "INSERT INTO EventType (EventTypeName) VALUES ('blah'); SELECT last_insert_rowid() FROM EventType" 
oRs.Open sSql oConn 
+4

Por cierto, con el controlador ODBC, debe dividir su consulta en 2 llamadas. – AngryHacker

+0

, entonces, ¿qué devuelve Insert()? - Sé que puedo buscarlo, pero podría ser útil aquí para completarlo, ya que así es como encontré esta publicación. –

2

No consumo VB, así que no sé la interfaz que se está usando con su base de datos, pero, como dijo bendewey, hay una función en la API C llamado sqlite3_last_insert_rowid() que devolverá el clave de entero primario para la última fila insertada, por lo que podría buscar una función similar en su interfaz.

Si eso no funciona, puede utilizar la consulta-específica SQLite:

SELECT last_insert_rowid() 
2

Puede llamar SELECT last_insert_rowid() después de su inserción

0

Si el uso

SELECT last_insert_rowid() 

devuelve el último rowid, puede usar:

SELECT last_insert_rowid() AS rowid FROM table_name LIMIT 1 

para obtener la última rowid de una mesa individual

+1

Esto no es lo que dice [la documentación] (https://www.sqlite.org/lang_corefunc.html#last_insert_rowid): "La función SQL last_insert_rowid() es un contenedor de la función de interfaz C/C++ sqlite3_last_insert_rowid()". lo que significa que no existe el último 'rowid' para una tabla individual. –

3

ejecutar esta consulta dentro de su código:

SELECT SEQ from sqlite_sequence WHERE name='tablename' 
Cuestiones relacionadas