ExecuteScalar

23/10/2004 - 00:57 por Oscar | Informe spam
Hola a todos,

Tengo un problemilla: Estoy haciendo un Insert into a una tabla que tiene un campo id autonumérico,
y luego tengo que añadir datos a otra tabla y utilizar el último autonumérico que haya generado el
insert into, algo así como,

"Insert into clientes bla bla..."
(me genera un nuevo id)

"insert into otra tabla donde tengo que poner el id recién generado"

La pregunta: Ahora, para salir del paso estoy haciendo lo siguiente:

1 primer insert into, y luego

2 sql="Select Last(Id) From Clientes"
cm.CommandText = sql
id_añadido = cm.ExecuteScalar

3 y una vez que tengo el id_añadido inmediatamente hago el insert into en la otra tabla

Pero claro, me arriesgo a que haya otro usuario desde otro pc se quede con los datos de la segunda
tabla en un registro que él haya añadido entre los pasos 1 y 2.

Con ExecuteScalar, o algo similar, no podría obtener el id generado por la primera insert into
directamente?

Gracias por todo,
Saludos. Oscar

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua
23/10/2004 - 01:31 | Informe spam
"Oscar" <veletapgARROBAwanadooPUNTOcom> escribió en el mensaje
news:
Hola a todos,

Tengo un problemilla: Estoy haciendo un Insert into a una tabla que tiene
un campo id autonumérico,
y luego tengo que añadir datos a otra tabla y utilizar el último
autonumérico que haya generado el
insert into, algo así como,

"Insert into clientes bla bla..."
(me genera un nuevo id)

"insert into otra tabla donde tengo que poner el id recién generado"

La pregunta: Ahora, para salir del paso estoy haciendo lo siguiente:

1 primer insert into, y luego

2 sql="Select Last(Id) From Clientes"
cm.CommandText = sql
id_añadido = cm.ExecuteScalar

3 y una vez que tengo el id_añadido inmediatamente hago el insert into
en la otra tabla

Pero claro, me arriesgo a que haya otro usuario desde otro pc se quede con
los datos de la segunda
tabla en un registro que él haya añadido entre los pasos 1 y 2.

Con ExecuteScalar, o algo similar, no podría obtener el id generado por la
primera insert into
directamente?

Gracias por todo,
Saludos. Oscar



Hola, Oscar:

Para obtener el ultimo campo autonumerico (en SQL Server o Access) generado
utilizas SELECT @@IDENTITY (en SQL Server o Access). Esta consulta debe
ejecutarse inmediatamente despues de la inserción. Si estás usando SQL
Server, es recomendable que combines la inserción y el SELECT @@IDENTITY en
un SP.

En ambos casos (bien cuando ejecutas un SP cuyo unico SELECT es justamente
SELECT @@IDENTITY, o cuando ejecutas el SELECT @@IDENTITY como CommandText
de un objeto COMMAND. puedes ejecutar ExecuteScalar para obtener el
resultado.

Salud!

Leonardo
mvp vb
Respuesta Responder a este mensaje
#2 Oscar
23/10/2004 - 02:28 | Informe spam
Gracias Leo, pero no estamos en las mismas? Si antes de ejecutar la consulta SELECT @@IDENTITY otro
usuario ya ha conseguido añadir otro registro, me devolverá el id del registro que ha añadido ese
usuario, y no el que añadí yo, no?

Salduos,
Oscar

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió en el mensaje
news:

"Oscar" <veletapgARROBAwanadooPUNTOcom> escribió en el mensaje
news:
> Hola a todos,
>
> Tengo un problemilla: Estoy haciendo un Insert into a una tabla que tiene
> un campo id autonumérico,
> y luego tengo que añadir datos a otra tabla y utilizar el último
> autonumérico que haya generado el
> insert into, algo así como,
>
> "Insert into clientes bla bla..."
> (me genera un nuevo id)
>
> "insert into otra tabla donde tengo que poner el id recién generado"
>
> La pregunta: Ahora, para salir del paso estoy haciendo lo siguiente:
>
> 1 primer insert into, y luego
>
> 2 sql="Select Last(Id) From Clientes"
> cm.CommandText = sql
> id_añadido = cm.ExecuteScalar
>
> 3 y una vez que tengo el id_añadido inmediatamente hago el insert into
> en la otra tabla
>
> Pero claro, me arriesgo a que haya otro usuario desde otro pc se quede con
> los datos de la segunda
> tabla en un registro que él haya añadido entre los pasos 1 y 2.
>
> Con ExecuteScalar, o algo similar, no podría obtener el id generado por la
> primera insert into
> directamente?
>
> Gracias por todo,
> Saludos. Oscar

Hola, Oscar:

Para obtener el ultimo campo autonumerico (en SQL Server o Access) generado
utilizas SELECT @@IDENTITY (en SQL Server o Access). Esta consulta debe
ejecutarse inmediatamente despues de la inserción. Si estás usando SQL
Server, es recomendable que combines la inserción y el SELECT @@IDENTITY en
un SP.

En ambos casos (bien cuando ejecutas un SP cuyo unico SELECT es justamente
SELECT @@IDENTITY, o cuando ejecutas el SELECT @@IDENTITY como CommandText
de un objeto COMMAND. puedes ejecutar ExecuteScalar para obtener el
resultado.

Salud!

Leonardo
mvp vb



Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
23/10/2004 - 03:40 | Informe spam
Gracias Leo, pero no estamos en las mismas? Si antes de ejecutar la
consulta SELECT @@IDENTITY otro usuario ya ha conseguido añadir otro
registro, me devolverá el id del registro que ha añadido ese usuario,
y no el que añadí yo, no?



Por lo menos para SQL Server corresponde a la conexion actual, es decir, si
el otro usuario usa otra conexion no va a modificar el valor devuelto en la
tuya.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#4 Oscar
23/10/2004 - 03:46 | Informe spam
Gracias Eduardo una vez más,

"Eduardo A. Morcillo [MS MVP VB]" <emorcilloATmvps.org> escribió en el mensaje
news:
> Gracias Leo, pero no estamos en las mismas? Si antes de ejecutar la
> consulta SELECT @@IDENTITY otro usuario ya ha conseguido añadir otro
> registro, me devolverá el id del registro que ha añadido ese usuario,
> y no el que añadí yo, no?

Por lo menos para SQL Server corresponde a la conexion actual, es decir, si
el otro usuario usa otra conexion no va a modificar el valor devuelto en la
tuya.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo



Respuesta Responder a este mensaje
#5 Leonardo Azpurua
23/10/2004 - 03:51 | Informe spam
"Oscar" <veletapgARROBAwanadooPUNTOcom> escribió en el mensaje
news:u5%
Gracias Leo, pero no estamos en las mismas? Si antes de ejecutar la
consulta SELECT @@IDENTITY otro
usuario ya ha conseguido añadir otro registro, me devolverá el id del
registro que ha añadido ese
usuario, y no el que añadí yo, no?

Salduos,
Oscar



No. @@IDENTITY "devuelve el último valor de identidad generado en cualquier
tabla en la sesión actual".

La sesión actual es la que abriste al crear la conexión. La unica
precacución que debes tener es utilizar el mismo objeto sqlCommand que
usaste para emitir la sentencia de inserción, pero eso es natural:

cmd.CommandText = "INSERT INTO "
cmd.ExecuteNonQuery
cmd.CommandText = "SELECT @@IDENTITY"
Dim id As Int64 = cmd.ExecuteScalar

e id es el valor de la columna con el atributo Identity de la fila recien
insertada.

Salud!

Leonardo
mvp vb
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida