none
Como insertar valores en dos tablas en forma simultánea con un botón desde Visual Studio 2017. RRS feed

  • Pregunta

  • Hola Comunidad!

    Necesito una guía de como insertar valores en dos tablas en forma simultánea con un botón desde Visual Studio 2017.

    Las dos tablas en cuestión estan relacionadas como se ve en la imagen.

    Necesito saber cuando se ingresa un nuevo gasto que las dos tablas agreguen en su respectivo PK y FK su mismo número de ID.

    ¿esto es posible?

    Gracias!!

    viernes, 2 de febrero de 2018 5:36

Respuestas

  • Sí, es factible tanto desde el código cliente como desde SQL Server, pero puesto que la pregunta la pusiste en este último foro (y no en uno de los de código cliente), te indico lo que se haría en SQL Server.

    Básicamente, se escribe un procedimiento almacenado que reciba como parámetros todos los datos a grabar en las dos tablas (salvo el PK/FK que se genera automáticamente). Y dentro del procedimiento se escriben dos sentencias insert:

    La primera inserta en la tabla GASTOS:

    Insert into GASTOS(Descripcion, nombre, fecha, Importe) VALUES (@Descripcion, @nombre, @fecha, @Importe)

    Y luego recuperas el valor del PK con scope_identity() y lo insertas en la segunda tabla:

    Insert into DATOS(NombreApellidoId, NombreApellido) VALUES(scope_identity(), @NombreApellido)

    Ese procedimiento lo invocas desde tu código cliente con un SqlCommand, y listos. Desde luego, algo similar lo puedes hacer directamente desde el cliente enviando las dos sentencias con un SqlCommand separándolas con punto y coma, si no quieres usar un procedimiento almacenado.

    • Propuesto como respuesta Pablo RubioModerator viernes, 2 de febrero de 2018 15:22
    • Marcado como respuesta MAXTER100 viernes, 2 de febrero de 2018 15:33
    viernes, 2 de febrero de 2018 8:02
  • Hola:

    Me parece que en la definición de esas dos tablas te falta algo.

    Opciones simples para solvertar la incidencia:

    1. La tabla gastos, le falta un dientificador, de manera que los gastos, tienen un id (identity), y tienen como clave foranea el NombreApellidoId.(Así podrías tener muchos registros de gastos para el NombreApellidosId
    2. Tal cual la planteas, sin tener esa columna, es que la tabla DATOS su campo NombreApellidoId no puede ser autonumérico. Tiene que ser "solo" númerico, porque si es autonumerico, lo genera el motor, no se lo pones tu en código.
    3. La tabla Datos, tiene un campo id autonumérico y sigues exactamente con la definición. De manera que la insert que te ha puesto Alberto es correcta.

    Un saludo

    • Marcado como respuesta MAXTER100 domingo, 4 de febrero de 2018 7:44
    domingo, 4 de febrero de 2018 7:38

Todas las respuestas

  • Sí, es factible tanto desde el código cliente como desde SQL Server, pero puesto que la pregunta la pusiste en este último foro (y no en uno de los de código cliente), te indico lo que se haría en SQL Server.

    Básicamente, se escribe un procedimiento almacenado que reciba como parámetros todos los datos a grabar en las dos tablas (salvo el PK/FK que se genera automáticamente). Y dentro del procedimiento se escriben dos sentencias insert:

    La primera inserta en la tabla GASTOS:

    Insert into GASTOS(Descripcion, nombre, fecha, Importe) VALUES (@Descripcion, @nombre, @fecha, @Importe)

    Y luego recuperas el valor del PK con scope_identity() y lo insertas en la segunda tabla:

    Insert into DATOS(NombreApellidoId, NombreApellido) VALUES(scope_identity(), @NombreApellido)

    Ese procedimiento lo invocas desde tu código cliente con un SqlCommand, y listos. Desde luego, algo similar lo puedes hacer directamente desde el cliente enviando las dos sentencias con un SqlCommand separándolas con punto y coma, si no quieres usar un procedimiento almacenado.

    • Propuesto como respuesta Pablo RubioModerator viernes, 2 de febrero de 2018 15:22
    • Marcado como respuesta MAXTER100 viernes, 2 de febrero de 2018 15:33
    viernes, 2 de febrero de 2018 8:02
  • Millones de gracias amigo !!!!!
    viernes, 2 de febrero de 2018 15:34
  • Me está apareciendo este mensaje:

    No se puede insertar un valor explícito en la columna de identidad de la tabla 'DATOS' cuando IDENTITY_INSERT es OFF.

    Calculo que en el Sql Manager tengo que ejecutar alguna línea.

    ¿me podrás facilitar la instrucción?

    Gracias!

    domingo, 4 de febrero de 2018 0:56
  • Hola:

    Me parece que en la definición de esas dos tablas te falta algo.

    Opciones simples para solvertar la incidencia:

    1. La tabla gastos, le falta un dientificador, de manera que los gastos, tienen un id (identity), y tienen como clave foranea el NombreApellidoId.(Así podrías tener muchos registros de gastos para el NombreApellidosId
    2. Tal cual la planteas, sin tener esa columna, es que la tabla DATOS su campo NombreApellidoId no puede ser autonumérico. Tiene que ser "solo" númerico, porque si es autonumerico, lo genera el motor, no se lo pones tu en código.
    3. La tabla Datos, tiene un campo id autonumérico y sigues exactamente con la definición. De manera que la insert que te ha puesto Alberto es correcta.

    Un saludo

    • Marcado como respuesta MAXTER100 domingo, 4 de febrero de 2018 7:44
    domingo, 4 de febrero de 2018 7:38
  • No se puede insertar un valor explícito en la columna de identidad de la tabla 'DATOS' cuando IDENTITY_INSERT es OFF.

    Eso significa que has marcado el campo como "autonumérico" cuando no debería serlo. En los autonuméricos normalmente nunca insertas ningún valor, sino que lo generan ellos solos. Si el campo tiene que coincidir con el valor de la otra tabla, entonces no debe ser autonumérico en las dos (solo lo es en la primera tabla, que es la que autogenera el número, después ese número se copia a la otra tabla, en la cual no es autonumérico).

    Lo del IDENTITY_INSERT es un parámetro de configuración que te permite saltarte esa restricción e insertarle un valor a ese campo autonumérico en el que normalmente no deberías insertar un valor. En este caso, no procede recurrir a esa opción, lo correcto es quitar el IDENTITY del campo.

    domingo, 4 de febrero de 2018 10:44