none
Generar manualmente un ID incrementable y usarlo con un BindingSource RRS feed

  • Pregunta

  • Personalmente no me gusta usar ID Auto incrementables, por lo tanto lo que hago es que a través del mismo procedimiento almacenado que ingresa un nuevo registro en la tabla genera toma el último ID existente en la tabla y le suma uno.

    CREATE PROCEDURE [dbo].[InsertCliente]
    (
    @rut nchar(10) = NULL,
    @nombre varchar(30)
    )
    AS
    SELECT @rut = (SELECT MAX(rut) + 1 FROM CLIENTE)
    INSERT INTO [dbo].[CLIENTE] ([rut], [nombre]) VALUES (@rut, @nombre)

    Básicamente la idea es manipular la PrimaryKey antes de realizar el Insert, el problema es que al hacer esto y ejecutar el programa, ingreso un nuevo registro en la grilla (con bindingsource) agrego el nombre - NO AGREGO EL RUT - y al perder el foco de la celda aparece el siguiente mensaje:

    http://1drv.ms/1HLwW7N

    Si ejecuto directamente el procedimiento almacenado a través de comandos y le paso un NULL como valor, el procedimiento me ingresa correctamente el registro.

    Espero me puedan ayudar con esto.

    Saludos.

    lunes, 2 de febrero de 2015 15:58

Todas las respuestas

  • hola

    pero si el @rut lo generas no deberias definirlo como un parametro de OUTPUT

    CREATE PROCEDURE [dbo].[InsertCliente]
    (
       @nombre varchar(30),
    
       @rut nchar(10) OUTPUT
    
    )


    entonces si lo asignas es un valor que recupera desde el codigo .net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 2 de febrero de 2015 16:08
  • Bueno, le cuento que su desconfianza con los autonuméricos probablemente es infundada y lo ha llevado a complicarse mucho a sí mismo. Su procedimiento almacenado padece de un problema grave de concurrencia: Si 2 usuarios intentan agregar registros a la misma vez, es posible que el RUT calculado para ambos sea el mismo, lo que hará que solamente uno de ellos grabe exitosamente.  Debería usar autonuméricos.

    Luego como ya le dijeron, el PA debería devolver el ID asignado al registro, lo que normalmente se hace con un parámetro tipo OUTPUT.  Necesitaríamos ver el código de DataBinding que usa usted, pero básicamente el objeto ligado a la nueva fila, después de que se graba en base de datos, debe actualizar su propiedad RUT con el valor devuelto en el parámetro OUTPUT del PA.


    Jose R. MCP
    Code Samples

    lunes, 2 de febrero de 2015 17:55
  • Gracias por tu respuesta.

    Hice el cambio pero pasa exactamente lo mismo cuando la celda pierde en foco en el datagridview solo ingreso el nombre y no el rut (o código incrementable), el SP quedó así:

    ALTER PROCEDURE [dbo].[InsertCliente]
    (
    @nombre varchar(30),
    @rut nchar(10) output
    )
    AS

    SELECT @rut = (SELECT MAX(rut) + 1 FROM CLIENTE)
    INSERT INTO [dbo].[CLIENTE] ([rut], [nombre]) VALUES (@rut, @nombre)

    Sigue apareciendo el mismo mensaje.

    Lo que pienso es que habría que intervenir "algún" método y rellenar la celda del RUT con un valor temporal -1  una vez que se guarde entonces se asigne el valor correcto., faltaría saber cual es el método que se debe intervenir.

    Cualquier aporte sería bienvenido.


    Saludos

    lunes, 2 de febrero de 2015 17:56
  • La corrección del PA el un paso. El error que le da probablemente proviene del DGV. Para ayudarle necesitamos saber cómo está vinculado a datos. Menciona un BindingSource. ¿Qué tipo de objetos contiene la lista vinculada a ese BindingSource?


    Jose R. MCP
    Code Samples

    lunes, 2 de febrero de 2015 18:04
  • Creo que tienes razón, el "No me gusta los autoincrementables" es infundada y recuerdo que fue porque en algún momento al hacer una migración de datos me dió problemas.

    Mejor usaré autoincrement y listo, es una app tan pequeña que no vale la pena complicarse con esas cosas.

    Muchas gracias a todos.

    lunes, 2 de febrero de 2015 18:14
  • >>Hice el cambio pero pasa exactamente lo mismo cuando la celda pierde en foco en el datagridview solo ingreso el nombre y no el rut (o código incrementable), el SP quedó así:

    que evento usas del DataGridView?

    como invocas al procedure? porque si bien el parametro rut no lo aisgnas si debes indicar el parametro cuya direccion sea de output

    el parametro out se define en el codigo al objeto command, pero no se asigna

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 2 de febrero de 2015 18:15
  • Agregué un Dataset y le arrastré la tabla desde el origen de datos.

    Despues en el DataGridView le agregué ese origen de datos.

    No se si eso responde tu pregunta.

    lunes, 2 de febrero de 2015 21:15