Principales respuestas
Problemas al insertar datos en base de datos integrada en visual studio

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.
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 ClassSaludos
Si te funciona marca como respuesta, para que sirva a otros
- Marcado como respuesta Pablo RubioModerator lunes, 10 de diciembre de 2018 16:21
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.
-
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
-
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).
- Propuesto como respuesta Pablo RubioModerator miércoles, 28 de noviembre de 2018 16:02
-
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 ClassSaludos
Si te funciona marca como respuesta, para que sirva a otros
- Marcado como respuesta Pablo RubioModerator lunes, 10 de diciembre de 2018 16:21