none
Ayuda con Transacciones SQL SERVER Y VB:NET RRS feed

  • Pregunta

  • Hola buenos dias

    Antes que nada les agradezco el tiempo que se estan tomando en leer mi mesaje gracias, ahora si empiezo, estoy realizando una aplicacion para varios usuarios en VB.NET 2005 con SQL 2005 en la cual el usuario ingresa los datos en la pantalla y estos van y se guardan a la base de datos despues la aplicacion despliega otra pantalla en donde les muestra el numero de folio con el cual han sido grabados sus datos es aqui en donde surge mi preocupacion yo estoy utilizando la Consulta:

    Código:

                  "SELECT MAX(ID) AS MAXIMO FROM TABLA"

    la tabla en donde guardo los registros tiene como llave primaria el ID el cual se autoincrementa, pero por ejemplo si yo agrego un nuevo registro la base de datos le asigna el ID1 y si al mismo tiempo otro usuario da de alta otro registro la base de datos le asigna el ID2, entonces ami me mostraria el ID numero 2 ya que es el ultimo ID ingresado y no corresponderia con el ID de mi registro, quisiera saber si me pueden ayudar con este problema que tengo, he leido que puedo utilizar Transacciones en VB.NET alguien me podria orientar, les agradezco mucho el tiempo que tengan buen dia.
    viernes, 4 de abril de 2014 18:49

Todas las respuestas

  • Hola,

    Para obtener el ID generado automáticamente basta que después de realizar el INSERT pongas lo siguiente

    SELECT @@identity

    Así podrías desde tu aplicación capturar el resultado de la Inserción.

    En cuanto a las transacciones lo deberías implementar si realizas varias acciones (DELETE, INSERT, UPDATE), ya que la idea es que todo quede almacenado o si hubo un error se devuelva el proceso, ejemplo envias a guardar los datos de un cliente y aparte envias a grabar las diferentes direcciones que tiene, si se presenta un error en alguna dirección la transacción debería retroceder todo el proceso, quiere decir no quedar almacenado ni el cliente ni las direcciones

    Espero haber sido claro y si no comenta.


    Harol Perez

    viernes, 4 de abril de 2014 19:09
  • Hola ErickSoto.

    Como dice Harol, la manera correcta es con @@identity, pero tienes que tener varias consideraciones, te transcribo parte de la ayudad de @@Identity

    Si la instrucción activa uno o más desencadenadores que realizan inserciones que, a su vez, generan valores de identidad, al llamar a @@IDENTITY inmediatamente después de la instrucción, se obtiene el último valor de identidad generado por los desencadenadores.

    Si tu intención es aplicar valores de identidad a tu número de folio no se debe, te transcribo parte de la ayuda.

    Las instrucciones y las transacciones erróneas pueden modificar la identidad actual de una tabla y crear espacios en los valores de las columnas de identidad.
    El valor de identidad jamás se revierte, aun cuando no se haya confirmado la transacción que intentó insertar el valor en la tabla.
    Por ejemplo, si se produce un error en una instrucción INSERT debido a una infracción de IGNORE_DUP_KEY, el valor de identidad actual de la tabla se sigue incrementando.

    En todo caso sería bueno revises la ayuda de Sql Server.

    Saludos.

    Mauricio

    sábado, 5 de abril de 2014 12:48
  • Hola Erick ,si entendí bien ,lo que entiendo es que la consulta esta correcta ,lo que faltaría es que asocies a tu tabla el usr que esta dando de alta,seria agregar un campo mas a tu tabla original con una clave secundaria que relacione a los usuarios,por lo tanto cuando filtres en la base no tendrías ese inconveniente ..si vos sos usr1 y diste de alta el id1 ,no encontrarías al id2 ,con max(id) y filtrando por el usr,en ese caso encontrarías como max(id) al id1 lo cual seria correcto. la consulta quedaría similar a esta: 

    select max(id) as maximo from tabla a ,usuario u where a.id_usuarior= u.id

    Siendo id_usuario la clave secundaria de tabla y id la clave principal de una tabla donde tengas los usr ,en el ej. de consulta sql la tabla se llama usuario.

    Si no interprete bien ,pido disculpas.

    Saludos.

    lunes, 7 de abril de 2014 8:32