none
Problemas al insertar datos en base de datos integrada en visual studio RRS feed

  • Pregunta

  • Hola a todos. 

    He creado un proyecto (me encuentro en la universidad) en visual studio 2017 empleando el lenguaje visual basic en windows forms y haciendo una base de datos dentro del mismo programa (base de datos basada en servicio). Hice un formulario sencillo con el cual pretendo agregar unos datos específicos a una tabla de la base de datos que cree previamente. Cuando doy clic en insertar los datos, de acuerdo a las validaciones que hice por código, me dice que ha agregado los datos correctamente pero cuando reviso la base de datos me doy cuenta que no tiene nada de lo que inserté. No se en donde esté fallando el código que realicé. Es el siguiente:

    Imports System.Data.SqlClient
    
    Public Class Registrarse
        Private Sub btnRegistrar_Click(sender As Object, e As EventArgs) Handles btnRegistrar.Click
    
            Dim con As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Visual.mdf;Integrated Security=True")
            Dim sql As String = "SELECT Nombre, Apellido, Documento, Telefono, Usuario, Contraseña FROM Usuarios"
            Dim cmd As New SqlCommand(sql, con)
    
            Try
                Dim ingreso As New SqlCommand("insert into Usuarios values('" & txtNombre.Text & "','" & txtApellido.Text & "'," & txtDocumento.Text & "," & txtTelefono.Text & ",'" & txtUsuario.Text & "','" & txtContraseña.Text & "')", con)
                con.Open()
                ingreso.ExecuteNonQuery()
                MsgBox("Registro de datos completado")
    
                txtDocumento.Text = ""
                txtNombre.Text = ""
                txtApellido.Text = ""
                txtTelefono.Text = ""
                txtUsuario.Text = ""
                txtContraseña.Text = ""
    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    
        End Sub
    End Class


    Le agradeceré mucho a quien pueda ayudarme para sacar adelante este proyecto.

    miércoles, 28 de noviembre de 2018 2:08

Respuestas

  • No le veo congruencia en lo que haces, nunca ejecutas el comando (cmd), por tanto terminas por no insertar nada, luego no se para que defines la cadena 'sql' si no la vas a usar y tampoco lo que quieres es un 'Select', entonces todo es como copiar y pegar, trata de razonar lo siguiente:

    Public Class Registrarse
        Private Sub btnRegistrar_Click(sender As Object, e As EventArgs) Handles btnRegistrar.Click

            Dim reg as Short
            Dim con As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Visual.mdf;Integrated Security=True")
            Dim sql As String = "insert into Usuarios (Nombre, Apellido, Documento, Telefono, Usuario, Contraseña) Values(@nam_, @ape_ , @doc_, @tel_, @usu_, @pwd_)"
            Dim cmd As New SqlCommand

            Try
                con.Open()
                cmd = New SqlCommand(sql, con)

                cmd.Parameters.AddWithValue("@nam_", txtNombre.Text)
                cmd.Parameters.AddWithValue("@ape", txtApellido.Text)
                cmd.Parameters.AddWithValue("@doc_", txtDocumento.Text)
                cmd.Parameters.AddWithValue("@tel_", txtTelefono.Text)
                cmd.Parameters.AddWithValue("@usu_", txtUsuario.Text)
                cmd.Parameters.AddWithValue("@pwd_", txtContraseña.Text)

                reg = cmd.ExecuteNonQuery() 'reg traera el numero de registros insertados

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

        End Sub

        If reg > 0 then
                MsgBox("Registro de datos completado")       
        Else
                MsgBox("Registro NO se actualizo")
        End If

    End Class

    Saludos

    Si te funciona marca como respuesta, para que sirva a otros

    viernes, 30 de noviembre de 2018 18:43

Todas las respuestas

  • Sospecho que debes estar examinando otra base de datos distinta, que no es la misma en la que te está insertando. Fíjate que en la cadena de conexión tiene puesto que la grabe en el |DataDirectory|, que no es fácil de saber cuál es porque depende del tipo de aplicación. Por ejemplo, si es Web te lo envía a la carpeta App_Data. No sé que ruta usa en una aplicación de escritorio. Te recomiendo que hagas la prueba escribiendo provisionalmente una ruta "fija" tal como "c:\micarpeta\misdatos.mdf" en el AttachDbFileName y hagas la prueba y luego examines ese archivo. Verás como sí que ha grabado. Después si quieres puedes dejar el |DataDirectory| e investigar a dónde va a parar.
    miércoles, 28 de noviembre de 2018 8:07
  • Hola Alberto,

    Muchas gracias por responder. En estos momentos me encuentro en  mi trabajo y no puedo hacer las pruebas pero lo intentaré cuando llegue a casa en la noche. En este punto me surge una duda ya que quiero que el programa funcione en cualquier computador porque es un proyecto que tengo que enviar a mi tutora (por eso la base de datos fue realizada en visual). La ruta que tengo en la cadena de conexión es la que tiene el app.config y si quiero poner la ruta del pc tal vez no funcione en otro computador porque esta cambiaría dependiendo de la ubicación donde la ponga en este caso la tutora.

    Descargué el proyecto en el PC del computador del trabajo y así está la ruta de la base de datos.

    C:\Documents and Settings\FACTURACION\Mis documentos\Descargas\Base de datos\Base de datos\Visual.mdf

    miércoles, 28 de noviembre de 2018 12:59
  •  que quiero que el programa funcione en cualquier computador

    POR ESO te dije que provisionalmente pusieses un ruta fija, solo para comprobar que efectivamente graba en ella y que por tanto el código que escribiste para grabar es correcto y el problema no está ahí. Una vez hecha la prueba, prescindes de la ruta fija de tu PC y tomas medidas diferentes.

    Después tendrás que decidir qué ruta vas a usar. Si usas |DataDirectory|, tienes que averiguar a dónde va a parar el |DataDirectory| en tiempo de ejecución. Puede que vaya a la carpeta del ejecutable, o a la carpeta de Documentos del usuario, o algo por el estilo.

    En ese sentido, no tiene ninguna utilidad lo que dices de "Descargué el proyecto en el PC del computador del trabajo y así está la ruta ..." ¿Cuál de las rutas? Piensa que la que usa Visual Studio desde el diseñador no tiene por qué ser la misma que usa el ejecutable en tiempo de ejecución (y de hecho casi seguro que este es el origen de tu problema, ya que tú miras los resultados en Visual Studio y, claro, no se ve nada de lo que se ha grabado en la BD usada en tiempo de ejecución).

    miércoles, 28 de noviembre de 2018 13:54
  • No le veo congruencia en lo que haces, nunca ejecutas el comando (cmd), por tanto terminas por no insertar nada, luego no se para que defines la cadena 'sql' si no la vas a usar y tampoco lo que quieres es un 'Select', entonces todo es como copiar y pegar, trata de razonar lo siguiente:

    Public Class Registrarse
        Private Sub btnRegistrar_Click(sender As Object, e As EventArgs) Handles btnRegistrar.Click

            Dim reg as Short
            Dim con As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Visual.mdf;Integrated Security=True")
            Dim sql As String = "insert into Usuarios (Nombre, Apellido, Documento, Telefono, Usuario, Contraseña) Values(@nam_, @ape_ , @doc_, @tel_, @usu_, @pwd_)"
            Dim cmd As New SqlCommand

            Try
                con.Open()
                cmd = New SqlCommand(sql, con)

                cmd.Parameters.AddWithValue("@nam_", txtNombre.Text)
                cmd.Parameters.AddWithValue("@ape", txtApellido.Text)
                cmd.Parameters.AddWithValue("@doc_", txtDocumento.Text)
                cmd.Parameters.AddWithValue("@tel_", txtTelefono.Text)
                cmd.Parameters.AddWithValue("@usu_", txtUsuario.Text)
                cmd.Parameters.AddWithValue("@pwd_", txtContraseña.Text)

                reg = cmd.ExecuteNonQuery() 'reg traera el numero de registros insertados

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

        End Sub

        If reg > 0 then
                MsgBox("Registro de datos completado")       
        Else
                MsgBox("Registro NO se actualizo")
        End If

    End Class

    Saludos

    Si te funciona marca como respuesta, para que sirva a otros

    viernes, 30 de noviembre de 2018 18:43