none
Insertar datos en 2 tablas sql desde VB. RRS feed

  • Pregunta

  • Saludos, tengo el codigo para guardar (insertar) datos en 1 tabla. pero deseo que agregar para insertar a 2 o más tablas al mismo instante.

    Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
            Try
                Using cnn As New SqlConnection("Data Source=.; Initial Catalog=BDpagos; Integrated Security = true")
                    cnn.Open()
                    Dim cmd As New SqlCommand("guardar", cnn)
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.CommandText = "guardar"
                    cmd.Parameters.Add("@Nombre_Empresa", SqlDbType.VarChar).Value = txtEmpresa.Text.Trim()
                    cmd.Parameters.Add("@Anunciante", SqlDbType.VarChar).Value = txtAnunciante.Text.Trim()
                    cmd.Parameters.Add("@Dni", SqlDbType.VarChar).Value = txtDni.Text.Trim()
                    cmd.Parameters.Add("@Ruc", SqlDbType.VarChar).Value = txtRuc.Text.Trim()
                    cmd.Parameters.Add("@Telf", SqlDbType.VarChar).Value = txtTelf.Text.Trim()
                    cmd.Parameters.Add("@Fecha", SqlDbType.Date).Value = dtpFecha.Text.Trim()

                    cmd.Parameters.Add("@Pago_Total", SqlDbType.Real).Value = txtTotal.Text.Trim()
                    cmd.Parameters.Add("@Pago_Cancelado", SqlDbType.Real).Value = txtCancelado.Text.Trim()
                    cmd.Parameters.Add("@Pago_Restante", SqlDbType.Real).Value = txtRestante.Text.Trim()

                    cmd.ExecuteNonQuery()
                    limpiar()
                    Cargardata()
                    MsgBox("Registrado Correctamente", MsgBoxStyle.Information)
                End Using
            Catch ex As Exception
                MsgBox("Pago No Registrado (Posible Errores: Campos Obligatorios o Fallo en el Sistema)", MsgBoxStyle.Critical)
            End Try
        End Sub

    Los valores negrita son de otra tabla y cuando intento registrar, solo guarda datos de la tabla 1, de tabla 2 sale NULL EN SQL.
    En mi procedure guardar si estan unidas las tablas, en vb no se como insertar a más de una.
    Gracias.


    • Editado Sergio.7 domingo, 30 de junio de 2013 21:32
    • Cambiado Enrique M. Montejo jueves, 1 de agosto de 2013 10:13 Acceso a datos
    domingo, 30 de junio de 2013 21:32

Todas las respuestas

  • En tu procedimiento almacenado supongo que tienes definido todos esos parámetros de entrada verdad? Entonces el problema es del sp creo yo...puedes escribrnoslo?

    tu desde vb.netbsolo  llamas al sp con sus parámetros de entrada, el resto lo realiza el motor de base de datos.


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

    • Editado Sergio Parra domingo, 30 de junio de 2013 21:41 aclarar
    domingo, 30 de junio de 2013 21:40
  • Este es el procedimiento de guardar

    create procedure guardar
    @Nombre_Empresa varchar (50),
    @Anunciante varchar (50),
    @Dni varchar (8),
    @Ruc varchar (11),
    @Telf varchar (9),
    @Fecha date,
    @Pago_total char (4),
    @Pago_Cancelado char (4),
    @Pago_Restante char (4)
    as
    begin
    insert into empresa (Nombre_Empresa,Anunciante,Dni,Ruc,Telf,Fecha)
    values (@Nombre_Empresa,@Anunciante,@Dni,@Ruc,@Telf,@Fecha)
    insert into Pagos (Pago_Total,Pago_Cancelado,Pago_Restante)
    values (@Pago_total, @Pago_Cancelado,@Pago_Restante)
    end

    domingo, 30 de junio de 2013 21:45
  • De todas formas cambia

    cmd.Parameters.Add("@Pago_Total", SqlDbType.Real).Value = txtTotal.Text.Trim()
                    cmd.Parameters.Add("@Pago_Cancelado", SqlDbType.Real).Value = txtCancelado.Text.Trim()
                    cmd.Parameters.Add("@Pago_Restante", SqlDbType.Real).Value = txtRestante.Text.Trim()

    Por convertir los datos de los textboxes a single para pasárselo como parámetro en tu sp, no vaya a ser que estés pasando datos no válidos


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

    domingo, 30 de junio de 2013 21:48
  • Pero en tu sp los parámetros que te fallan están definidos como char()

    create procedure guardar

    ....

    @Pago_total char (4),
    @Pago_Cancelado char (4),
    @Pago_Restante char (4)

    Cambia el tipo de dato con el que corresponda en tu tabla


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

    domingo, 30 de junio de 2013 21:51
  • Espero haberme explicado...de que tipo de dato son esos campos en tu tabla? Puedes mostrarlo?

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

    domingo, 30 de junio de 2013 21:53
  • Si lo cambie por char pero nada, solo me registra la tabla 1, la tabla 2 (PAGOS) cuando voy a sql y muestro sale NULL.

    Creo que falta algún adicional en el VB (boton guardar)

    domingo, 30 de junio de 2013 22:01
  • Si lo cambie por char pero nada, solo me registra la tabla 1, la tabla 2 (PAGOS) cuando voy a sql y muestro sale NULL.

    que cambiaste por char ?

    se supone que debes definir el mismo tipo de datos con el cual defines los campos en la tabla, por lo que la pregunta seria

    de que tipos son los campos de la tabla Pagos  ? son numerico o cadena de caracteres

    debes seguir una coherencia en los tipos de datos y todo debes ser igual, si en la tabla defines campos del tipo INT el parametro y el valor que asignes desde .net tambien debes ser numericos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    domingo, 30 de junio de 2013 22:05
  • Puedes crear Trigger (disparadores) en sql que se ejecuten después de que insertes datos en dicha tabla..

    Solo le creas y sql los ejecuta por si mismo.

     

    Bismarck Gael

    domingo, 30 de junio de 2013 22:08
  • Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
             Try
                 Using cnn As New SqlConnection("Data Source=.; Initial Catalog=BDpagos; Integrated Security = true")
                     cnn.Open()
                     Dim cmd As New SqlCommand("guardar", cnn)
                     cmd.CommandType = CommandType.StoredProcedure
                     cmd.CommandText = "guardar"
                     cmd.Parameters.AddWithValue("@Nombre_Empresa",  txtEmpresa.Text.Trim())
                     cmd.Parameters.AddWithValue ("@Anunciante", txtAnunciante.Text.Trim())
                     cmd.Parameters.AddWithValue("@Dni", txtDni.Text.Trim())
                     cmd.Parameters.AddWithValue ("@Ruc", txtRuc.Text.Trim())
                     cmd.Parameters.AddWithValue ("@Telf", txtTelf.Text.Trim())
                     cmd.Parameters.AddWithValue ("@Fecha",  dtpFecha.Text.Trim())
     
                    cmd.Parameters.AddWithValue ("@Pago_Total", txtTotal.Text.Trim())
                     cmd.Parameters.AddWithValue ("@Pago_Cancelado", txtCancelado.Text.Trim())
                     cmd.Parameters.AddWithValue ("@Pago_Restante", txtRestante.Text.Trim())
     
                    cmd.ExecuteNonQuery()
                     limpiar()
                     Cargardata()
                     MsgBox("Registrado Correctamente", MsgBoxStyle.Information)
                 End Using
             Catch ex As Exception
                 MsgBox("Pago No Registrado (Posible Errores: Campos Obligatorios o Fallo en el Sistema)", MsgBoxStyle.Critical)
             End Try
         End Sub
    

    Utiliza AddWithValue...y verifica que los datos  de los parámetros de pago si los defines con char(4) no excedan de ese tamaño 

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

    domingo, 30 de junio de 2013 22:11
  • si coloco numeric en SQL  y en visual:               
    cmd.Parameters.Add("@Pago_Total", SqlDbType.Char).Value = txtTotal.Text.Trim()

    Despues del SqlDbType. NO HAY NUMERIC, por ello no coloce numeric en SQL. Que datos seria para numeros con decimales que tenga SQL  y que admita el SqlDbType.DATOSENSQL

    domingo, 30 de junio de 2013 22:11
  • Double

    float


    Bismarck Gael

    domingo, 30 de junio de 2013 22:13
  • hola Gael_92

    pero aqui no tienen nada que ver lo triggers, eso es para automatizar una operacion con datos existentes

    aqui esta pasando datos desde codigo a un procedure, el problema son los tipos de datos que se estan definiedo los cuales no coinciden

    saludo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    domingo, 30 de junio de 2013 22:13
  • Si, debes igualar el tipo de dato de la tabla con el tipo de  dato del parámetro.  

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

    domingo, 30 de junio de 2013 22:16
  • si coloco numeric en SQL  y en visual

    sigues sin ser coherente con los tipos de datos, como esperas que un parametro numerico lo tomes desde un char, es codigo no magia que convierte de un tipo a otro

    debes respetar los tipos

    algo que aun no respondes es de que tipo defines los campos en a tabla Pagos ? porque ese mismo tipo deberias usar para los parametro y en el codigo .net

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    domingo, 30 de junio de 2013 22:24
  • Entiendo, ya lo cambie a smallMoney a los 3 ya que al ser pago es dinero.
    Pero igual no registra los datos de pagos, solo los datos de la empresa.
    Quedo asi:

    SQL

    create procedure guardar
    @Nombre_Empresa varchar (50),
    @Anunciante varchar (50),
    @Dni varchar (8),
    @Ruc varchar (11),
    @Telf varchar (9),
    @Fecha date,
    @Pago_Total smallmoney,
    @Pago_Cancelado smallmoney,
    @Pago_Restante smallmoney
    as
    begin
    insert into empresa (Nombre_Empresa,Anunciante,Dni,Ruc,Telf,Fecha)
    values (@Nombre_Empresa,@Anunciante,@Dni,@Ruc,@Telf,@Fecha)
    insert into Pagos (Pago_Total,Pago_Cancelado,Pago_Restante)
    values (@Pago_total, @Pago_Cancelado,@Pago_Restante)
    end

    VB

    Try
                Using cnn As New SqlConnection("Data Source=.; Initial Catalog=BDpagos; Integrated Security = true")
                    cnn.Open()
                    Dim cmd As New SqlCommand("guardar", cnn)
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.CommandText = "guardar"
                    cmd.Parameters.Add("@Nombre_Empresa", SqlDbType.VarChar).Value = txtEmpresa.Text.Trim()
                    cmd.Parameters.Add("@Anunciante", SqlDbType.VarChar).Value = txtAnunciante.Text.Trim()
                    cmd.Parameters.Add("@Dni", SqlDbType.VarChar).Value = txtDni.Text.Trim()
                    cmd.Parameters.Add("@Ruc", SqlDbType.VarChar).Value = txtRuc.Text.Trim()
                    cmd.Parameters.Add("@Telf", SqlDbType.VarChar).Value = txtTelf.Text.Trim()
                    cmd.Parameters.Add("@Fecha", SqlDbType.Date).Value = dtpFecha.Text.Trim()
                    cmd.Parameters.Add("@Pago_Total", SqlDbType.SmallMoney).Value = txtTotal.Text.Trim()
                    cmd.Parameters.Add("@Pago_Cancelado", SqlDbType.SmallMoney).Value = txtCancelado.Text.Trim()
                    cmd.Parameters.Add("@Pago_Restante", SqlDbType.SmallMoney).Value = txtRestante.Text.Trim()
                    cmd.ExecuteNonQuery()
                    limpiar()
                    Cargardata()
                    MsgBox("Registrado Correctamente", MsgBoxStyle.Information)
                End Using
            Catch ex As Exception
                MsgBox("Pago No Registrado (Posible Errores: Campos Obligatorios o Fallo en el Sistema)", MsgBoxStyle.Critical)
            End Try

    domingo, 30 de junio de 2013 22:36
  • recuerda que debes respetar los tipos de datos

    cmd.Parameters.Add("@Pago_Total", SqlDbType.SmallMoney).Value = Convert.ToDecimal(txtTotal.Text)

    asi en los 3 parametros

    debes asegurar que sean valor numericos validos los que asignas

    ----

    tambien podrias ver de poner un procedure un punto y coma o un GO para separar cada instruccion

    insert into empresa (Nombre_Empresa,Anunciante,Dni,Ruc,Telf,Fecha)
    values (@Nombre_Empresa,@Anunciante,@Dni,@Ruc,@Telf,@Fecha);

    insert into Pagos (Pago_Total,Pago_Cancelado,Pago_Restante)
    values (@Pago_total, @Pago_Cancelado,@Pago_Restante)

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 30 de junio de 2013 23:08
  • Ya no vota error al registrar pero cuando muestro las tablas en SQL la tabla 2 sale en sus campos NULL. Es decir sigue registrando vacios los campos.
    lunes, 1 de julio de 2013 0:05
  • create procedure guardar
    @Nombre_Empresa varchar (50),
    @Anunciante varchar (50),
    @Dni varchar (8),
    @Ruc varchar (11),
    @Telf varchar (9),
    @Fecha date,
    @Pago_Total smallmoney,
    @Pago_Cancelado smallmoney,
    @Pago_Restante smallmoney
    as
    begin
    insert into empresa (Nombre_Empresa,Anunciante,Dni,Ruc,Telf,Fecha)
    values (@Nombre_Empresa,@Anunciante,@Dni,@Ruc,@Telf,@Fecha)
    insert into Pagos (Pago_Total,Pago_Cancelado,Pago_Restante)
    values (@Pago_total, @Pago_Cancelado,@Pago_Restante)
    end

    Es correcto este procedimiento para insertar datos en 2 tablas ?

    lunes, 1 de julio de 2013 2:07
  • que pasas si en lugar de definir

    Catch ex As Exception
                MsgBox("Pago No Registrado (Posible Errores: Campos Obligatorios o Fallo en el Sistema)", MsgBoxStyle.Critical)
    End Try

    usas

    Catch ex As Exception
                MsgBox(ex.Message)
    End Try

    digo porque si el procedutre lanzar un error ni te enteras cual es el mensaje

    puede que el segundo insert este fallando por eso no registra el insert

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 1 de julio de 2013 2:13
  • Coloce

    Catch ex As Exception
                MsgBox(ex.Message)
    End Try
    Para probar si lanza error, pero me lanza guardado con éxito, entonces el insert esta mal planteando, algun apoyo?, primera vez que intento insertar en 2 tablas.

    lunes, 1 de julio de 2013 2:18
  • Para probar si lanza error, pero me lanza guardado con éxito

    como es eso, no pueden darse los dos casos, o se muestra un mensaje de error, o se muestra el de registrado correctamente, ambos no pueden darse

    si muestra un error que dice el mensaje ?


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 1 de julio de 2013 2:34
  • Claro sale registrado correctamente o alguna forma de registrar datos en 2 tablas a más con diferentes prodecure? cualquier alternativa es buena, Gracias
    lunes, 1 de julio de 2013 2:41
  • podrias separar las queries en dos procedure diferentes

    Using cnn As New SqlConnection("Data Source=.; Initial Catalog=BDpagos; Integrated Security = true")
    	cnn.Open()
    	
    	Using cmd As New SqlCommand("guardar", cnn)
    		cmd.CommandType = CommandType.StoredProcedure
    		cmd.Parameters.Add("@Nombre_Empresa", SqlDbType.VarChar).Value = txtEmpresa.Text.Trim()
    		cmd.Parameters.Add("@Anunciante", SqlDbType.VarChar).Value = txtAnunciante.Text.Trim()
    		cmd.Parameters.Add("@Dni", SqlDbType.VarChar).Value = txtDni.Text.Trim()
    		cmd.Parameters.Add("@Ruc", SqlDbType.VarChar).Value = txtRuc.Text.Trim()
    		cmd.Parameters.Add("@Telf", SqlDbType.VarChar).Value = txtTelf.Text.Trim()
    		cmd.Parameters.Add("@Fecha", SqlDbType.Date).Value = dtpFecha.Text.Trim()
    		cmd.ExecuteNonQuery()
    	End Using
    	
    	Using cmd As New SqlCommand("guardarpagos", cnn)
    		cmd.CommandType = CommandType.StoredProcedure
    		cmd.Parameters.Add("@Pago_Total", SqlDbType.SmallMoney).Value = txtTotal.Text.Trim()
    		cmd.Parameters.Add("@Pago_Cancelado", SqlDbType.SmallMoney).Value = txtCancelado.Text.Trim()
    		cmd.Parameters.Add("@Pago_Restante", SqlDbType.SmallMoney).Value = txtRestante.Text.Trim()
    		cmd.ExecuteNonQuery()
    	End Using
    	
    	limpiar()
    	Cargardata()
    	MsgBox("Registrado Correctamente", MsgBoxStyle.Information)
    	
    End Using

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 1 de julio de 2013 3:12
  • Hola que tal Leandro Tuttini. Quisiera que por favor me ayudes. Mi Aplicacion (Silverlight 4, C#, VS2010, Ria Services, NET 4), lo que tengo que hacer es mandar a imprimir TabControl (0-8) y me caben bien en 4 pagina de impresion + titulos y num de paginas. Ejemplo:

    No. Pagina 1 (El numero de pagina debe ir en pie de pagina, a la derecha )

    Titulo1= "REGISTRO MEXICANO "  con font =20, centrado, Bold. como le hago para pasar al siguiente renglon.

    Titulo2="Estudio de cohorte " Con font =14, centrado, cursiva, como le hago para pasar al siguiente renglon.

    Imprimir un Canvas (Canvas10 asi se llama en XAML q tiene labes y txt)

    Aqui imprimir los TabControl (GpoID 1-8) asi se llama el grid de cada TabControl.

    GpoId

    GpoId2

    Pagina 2

    GpoId3

    GpoId4

    Pagina 3

    GpoId5

    GpoId6

    Pagina 4

    GpoId7

    GpoId8

    Super mil garcias.
    Lo que pude hacer con el ejemplo de microsoft es imprimir lo que esta en pantalla, pero me faltan los titulos, el siguiente grid en la misma pagina y crear las demas paginas con los grid.

    // create an instance of PrintDocument

                PrintDocument document = new PrintDocument();

                // tell the API what to print

                document.PrintPage += (s, args) =>

                {

                    args.PageVisual = LayoutRoot;

                };           

                document.Print("Print In Silverlight");

    lunes, 1 de julio de 2013 3:12
  • Creo encontrar el error,
    Tabla empresa y Tabla Pagos tiene de mismo campo CodPago (para los inner join)
    Cuando aplico el codigo escrito funciona pero no se registra en orden.  aplicando el left outer join entre empresa y pagos solo muestra datos de la empresa los de pago salen NULL imagino que es porque no tiene el CodPago en común. igualmente si muestro con right outer join solo muestra los pagos y datos de la empresa en NULL, lo que indica que si registra desde VB, pero no tiene el campo en común.

    Como solucionar ello?

    lunes, 1 de julio de 2013 15:46
  • Pero en los inserta que indicas no hay ningún codpago

    insert into empresa (Nombre_Empresa,Anunciante,Dni,Ruc,Telf,Fecha)
    values (@Nombre_Empresa,@Anunciante,@Dni,@Ruc,@Telf,@Fecha)
    insert into Pagos (Pago_Total,Pago_Cancelado,Pago_Restante)
    values (@Pago_total, @Pago_Cancelado,@Pago_Restante)

    Normal que no se relacionen.

    Puedes mostrar el diseño de ambas tablas?


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

    lunes, 1 de julio de 2013 15:52
  • yo diseñaría la tabla pagos con un idempresa para relacionarlos

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

    lunes, 1 de julio de 2013 15:53
  • Saludos puedes brindarme un ejemplo de procedure insertar para 1 tabla con 1 datos relacionado a otra.
    Gracias

    lunes, 1 de julio de 2013 16:42
  • Me sirvió de mucho gracias
    miércoles, 5 de febrero de 2014 21:13