none
procedimiento almacenado para tomar el ultimo ID Insertado RRS feed

  • Pregunta

  • Muy bien dia  alos presentes

    A pesar de que filtre la busqueda en el foro acerca de algo que se acerque a alguna solucion del inconveniente que tengo, no encontre algo parecido.

    Desarrollo un proyecto en donde se manejan procedimientos almacenados, con arquitectura de tres capas,  eso creo.

    Ya tengo algo de aclaracion de como tomar el ultimo ID insertado mediante SCOPE_IDENTITY(), pero este ultimo ID lo necesito para otro INSERT simultaneo.

    La idea es ingresar un usuario con un codigo de perfil, (Administrador, consultor,estandar), y luego capturar su ID (autoincremento) para insertarlo inmediatamente en otro tabla donde se asignan los privilegios de cada perfil, las dos tablas estan relacionadas.

    el procedimiento es asi para la insercion de usuarios:

    create proc insertar_usuario
    @cod_user int output,
    @nombre varchar(60),
    @apellido varchar(60),
    @cod_per int,
    @nickname varchar(40),
    @password varchar(18),
    @documento int,
    @email varchar(60)
    as
    INSERT INTO usuario (nombre,apellido,cod_per,nickname,password,documento,email) VALUES (@nombre,@apellido,@cod_per,@nickname,@password,@documento,@email); 
    SELECT @cod_user = SCOPE_IDENTITY();
    RETURN
    

    luego el procedimiento de insertar privilegios:

    create proc insertar_privilegios
    @cod_user int,
    @abrir int,
    @salvar int,
    @crear int,
    @creapro int,
    @actuapro int,
    @elimipro int,
    @fecha datetime,
    @consuinfo int,
    @consusua int,
    @usuario int,
    @configuracion int,
    @creacliente int
    as
    INSERT INTO privilegios (cod_user,abrir,salvar,crear,creapro,actuapro,elimipro,fecha,consuinfo,consusua,usuario,configuracion,creacliente) VALUES (@cod_user,@abrir,@salvar,@crear,@creapro,@actuapro,@elimipro,@fecha,@consuinfo,@consusua,@usuario,@configuracion,@creacliente)
    

    Ahora desde la capa datos, con este metodo intento hacer la insercion.

    Public Function insertarUsuario(ByVal dtusu As Vusuario) As Boolean
            Try
                conectar()
                cmd = New SqlCommand("insertar_usuario")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cn
    
                Dim cod_user As Integer = 0
    
                'tomo los datos a insertar con el procedimiento almacenado
                cmd.Parameters.AddWithValue("@nombre", dtusu.gnombre)
                cmd.Parameters.AddWithValue("@apellido", dtusu.gapellido)
                cmd.Parameters.AddWithValue("@cod_per", dtusu.gcod_per)
                cmd.Parameters.AddWithValue("@nickname", dtusu.gnickname)
                cmd.Parameters.AddWithValue("@password", dtusu.gpass)
                cmd.Parameters.AddWithValue("@documento", dtusu.gdocu)
                cmd.Parameters.AddWithValue("@email", dtusu.gemail)
    
                cod_user = Convert.ToInt32(cmd.ExecuteScalar())
    
                cmd = New SqlCommand("insertar_privilegios")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cn
    
                ''tomo los datos a insertar con el procedimiento almacenado
                cmd.Parameters.AddWithValue("@co_user", cod_user)
                cmd.Parameters.AddWithValue("@abrir", dtusu.gabrir)
                cmd.Parameters.AddWithValue("@salvar", dtusu.gsalvar)
                cmd.Parameters.AddWithValue("@crear", dtusu.gcrear)
    
                cmd.Parameters.AddWithValue("@creapro", dtusu.gcreapro)
                cmd.Parameters.AddWithValue("@actuapro", dtusu.gactuapro)
                cmd.Parameters.AddWithValue("@elimipro", dtusu.gelimipro)
    
                cmd.Parameters.AddWithValue("@fecha", (dtusu.gfecha))
    
                cmd.Parameters.AddWithValue("@consuinfo", dtusu.gconsuinfo)
                cmd.Parameters.AddWithValue("@consusua", dtusu.gconsusua)
    
                cmd.Parameters.AddWithValue("@usuario", dtusu.gusuario)
                cmd.Parameters.AddWithValue("@configuracion", dtusu.gconfiguracion)
                cmd.Parameters.AddWithValue("@creacliente", dtusu.gcreacliente)
    
                If cmd.ExecuteNonQuery Then
                    Return True
                Else
                    Return False
                End If
    
            Catch ex As System.Data.SqlClient.SqlException
                MsgBox(ex.Message, MsgBoxStyle.Critical)
                Return False
            Finally
                desconectar()
            End Try
        End Function

    Desde la capa presentacion paso los parametros de los datos del usuario y los permisos asignados, atraves de la capa logica, que es la que captura los datos y esta los envia a la capa datos.

    al ejecutar el formulario solo me inserta lo datos del usuario es decir el procedimiento de "insertar_usuario", funciona, pero los privilegios, con el procedimiento, "insertar _privilegios", no me toma los datos.

    Las dudas son:

    Es con dos procedimientos almacenados la captura de datos o es con uno?

    Como seria la sentencia del la ejecucion del procedimiento, ya que uso un

    " cod_user = Convert.ToInt32(cmd.ExecuteScalar()) " y luego un "cmd.ExecuteNonQuery" atraves del condicional.

    En este ultimo tengo las dudas.

    De antemano gracias por la atencion.





    martes, 24 de junio de 2014 19:38

Respuestas

  • Hola a todos los presentes, puesde verdad agradezco su pronta respuesta y la atencion a los enunciados, segui muy al pie del codigo sus consejos y al final lo pude solventar, de la siguiente forma

    Habia un procedimiento almacenado que me daba problemas:

    //originalmente estaba asi
    create proc insertar_usuario
    @cod_user int output,
    @nombre varchar(60),
    @apellido varchar(60),
    @cod_per int,
    @nickname varchar(40),
    @password varchar(18),
    @documento int,
    @email varchar(60)
    as
    INSERT INTO usuario (nombre,apellido,cod_per,nickname,password,documento,email) VALUES (@nombre,@apellido,@cod_per,@nickname,@password,@documento,@email); 
    SELECT @cod_user = SCOPE_IDENTITY();
    RETURN
    
    
    //ahora lo ejecuto asi
    create proc insertar_usuario
    @nombre varchar(60),
    @apellido varchar(60),
    @cod_per int,
    @nickname varchar(40),
    @pass varchar(18),
    @documento int,
    @email varchar(60)
    as
    INSERT INTO usuario (nombre,apellido,cod_per,nickname,pass,documento,email) VALUES (@nombre,@apellido,@cod_per,@nickname,@pass,@documento,@email);SELECT SCOPE_IDENTITY()
    

    revise nuevamente mis variables de la capa logica y habia dos errores ya que dos variables eran de tipo string y en la base datos se almacenaban como bit, en la parte de registro de permisos, los cuales los capturo con un true=1 y false=0, al dar click en unos checkbox.

    y en la parte de la capa de datos con la clase de insertar, la deje tal cual sin cambiar nada.


    Public Function insertarUsuario(ByVal dtusu As Vusuario) As Boolean Try conectar()

    'carga delprimer procedimiento almacenado cmd = New SqlCommand("insertar_usuario") cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cn 'tomo los datos a insertar con el procedimiento almacenado cmd.Parameters.AddWithValue("@nombre", dtusu.gnombre) cmd.Parameters.AddWithValue("@apellido", dtusu.gapellido) cmd.Parameters.AddWithValue("@cod_per", dtusu.gcod_per) cmd.Parameters.AddWithValue("@nickname", dtusu.gnickname) cmd.Parameters.AddWithValue("@pass", dtusu.gpass) cmd.Parameters.AddWithValue("@documento", dtusu.gdocu) cmd.Parameters.AddWithValue("@email", dtusu.gemail) Dim cod_user As Integer = 0 cod_user = Convert.ToInt32(cmd.ExecuteScalar())

    'carga del segundo procedimiento almacenado cmd = New SqlCommand("insertar_privilegios") cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cn ''tomo los datos a insertar con el procedimiento almacenado cmd.Parameters.AddWithValue("@co_user", cod_user) cmd.Parameters.AddWithValue("@abrir", dtusu.gabrir) cmd.Parameters.AddWithValue("@salvar", dtusu.gsalvar) cmd.Parameters.AddWithValue("@crear", dtusu.gcrear) cmd.Parameters.AddWithValue("@creapro", dtusu.gcreapro) cmd.Parameters.AddWithValue("@actuapro", dtusu.gactuapro) cmd.Parameters.AddWithValue("@elimipro", dtusu.gelimipro) cmd.Parameters.AddWithValue("@fecha", (dtusu.gfecha)) cmd.Parameters.AddWithValue("@consuinfo", dtusu.gconsuinfo) cmd.Parameters.AddWithValue("@consusua", dtusu.gconsusua) cmd.Parameters.AddWithValue("@usuario", dtusu.gusuario) cmd.Parameters.AddWithValue("@configuracion", dtusu.gconfiguracion) cmd.Parameters.AddWithValue("@creacliente", dtusu.gcreacliente) If cmd.ExecuteNonQuery Then Return True Else Return False End If Catch ex As System.Data.SqlClient.SqlException MsgBox(ex.Message, MsgBoxStyle.Critical) Return False Finally desconectar() End Try End Function

    Nuevamente muchisimas gracias



    • Marcado como respuesta gilmo_26 miércoles, 25 de junio de 2014 4:15
    miércoles, 25 de junio de 2014 4:15

Todas las respuestas

  • hola. Si pones un punto de ruptura en la linea

       cod_user = Convert.ToInt32(cmd.ExecuteScalar())

    y pulsas F10, que valor tiene cod_user?


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 24 de junio de 2014 21:39
  • yo hago este SP que me devuelve el ultimo pk, quiero decir que el sp introduce un registro e inmediatamente devuelve el id del registro insertado

    CREATE PROCEDURE PLIQ_INSERTAR_TOTAL_MOVIMIENTO
    @PERIODO_TOTAL_MOVIMIENTO DATE,
    AS
    INSERT INTO TLIQ_TOTAL_MOVIMIENTO 
    VALUES 
    (@PERIODO_TOTAL_MOVIMIENTO);
    SELECT CONVERT(INT, SCOPE_IDENTITY()) [Código Formulario]

    "[Código Formulario]" es el nombre del campo devuelto.


    Roy Sillerico

    martes, 24 de junio de 2014 21:48
  • también puedes recuperar el id de la siguiente forma

    SqlParameter outParam = cmd.Parameters.Add("@cod_user", SqlDbType.Integer)
    outParam.Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery(); cod_user = Convert.ToInt32(cmd.Parameters["@cod_user"].Value);

    Como has establecido un parámetro output en tu procedimiento almacenado,la forma de recuperarlo es como te indico,primeramente creando un parámetro de output en tu objeto command para poder recogerlo


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos



    martes, 24 de junio de 2014 21:51
  • Hola a todos los presentes, puesde verdad agradezco su pronta respuesta y la atencion a los enunciados, segui muy al pie del codigo sus consejos y al final lo pude solventar, de la siguiente forma

    Habia un procedimiento almacenado que me daba problemas:

    //originalmente estaba asi
    create proc insertar_usuario
    @cod_user int output,
    @nombre varchar(60),
    @apellido varchar(60),
    @cod_per int,
    @nickname varchar(40),
    @password varchar(18),
    @documento int,
    @email varchar(60)
    as
    INSERT INTO usuario (nombre,apellido,cod_per,nickname,password,documento,email) VALUES (@nombre,@apellido,@cod_per,@nickname,@password,@documento,@email); 
    SELECT @cod_user = SCOPE_IDENTITY();
    RETURN
    
    
    //ahora lo ejecuto asi
    create proc insertar_usuario
    @nombre varchar(60),
    @apellido varchar(60),
    @cod_per int,
    @nickname varchar(40),
    @pass varchar(18),
    @documento int,
    @email varchar(60)
    as
    INSERT INTO usuario (nombre,apellido,cod_per,nickname,pass,documento,email) VALUES (@nombre,@apellido,@cod_per,@nickname,@pass,@documento,@email);SELECT SCOPE_IDENTITY()
    

    revise nuevamente mis variables de la capa logica y habia dos errores ya que dos variables eran de tipo string y en la base datos se almacenaban como bit, en la parte de registro de permisos, los cuales los capturo con un true=1 y false=0, al dar click en unos checkbox.

    y en la parte de la capa de datos con la clase de insertar, la deje tal cual sin cambiar nada.


    Public Function insertarUsuario(ByVal dtusu As Vusuario) As Boolean Try conectar()

    'carga delprimer procedimiento almacenado cmd = New SqlCommand("insertar_usuario") cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cn 'tomo los datos a insertar con el procedimiento almacenado cmd.Parameters.AddWithValue("@nombre", dtusu.gnombre) cmd.Parameters.AddWithValue("@apellido", dtusu.gapellido) cmd.Parameters.AddWithValue("@cod_per", dtusu.gcod_per) cmd.Parameters.AddWithValue("@nickname", dtusu.gnickname) cmd.Parameters.AddWithValue("@pass", dtusu.gpass) cmd.Parameters.AddWithValue("@documento", dtusu.gdocu) cmd.Parameters.AddWithValue("@email", dtusu.gemail) Dim cod_user As Integer = 0 cod_user = Convert.ToInt32(cmd.ExecuteScalar())

    'carga del segundo procedimiento almacenado cmd = New SqlCommand("insertar_privilegios") cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cn ''tomo los datos a insertar con el procedimiento almacenado cmd.Parameters.AddWithValue("@co_user", cod_user) cmd.Parameters.AddWithValue("@abrir", dtusu.gabrir) cmd.Parameters.AddWithValue("@salvar", dtusu.gsalvar) cmd.Parameters.AddWithValue("@crear", dtusu.gcrear) cmd.Parameters.AddWithValue("@creapro", dtusu.gcreapro) cmd.Parameters.AddWithValue("@actuapro", dtusu.gactuapro) cmd.Parameters.AddWithValue("@elimipro", dtusu.gelimipro) cmd.Parameters.AddWithValue("@fecha", (dtusu.gfecha)) cmd.Parameters.AddWithValue("@consuinfo", dtusu.gconsuinfo) cmd.Parameters.AddWithValue("@consusua", dtusu.gconsusua) cmd.Parameters.AddWithValue("@usuario", dtusu.gusuario) cmd.Parameters.AddWithValue("@configuracion", dtusu.gconfiguracion) cmd.Parameters.AddWithValue("@creacliente", dtusu.gcreacliente) If cmd.ExecuteNonQuery Then Return True Else Return False End If Catch ex As System.Data.SqlClient.SqlException MsgBox(ex.Message, MsgBoxStyle.Critical) Return False Finally desconectar() End Try End Function

    Nuevamente muchisimas gracias



    • Marcado como respuesta gilmo_26 miércoles, 25 de junio de 2014 4:15
    miércoles, 25 de junio de 2014 4:15