none
Insertar nuevos registros en BD SQL Server 2008

    Question

  • Hola!

    Les paso este code snippet para que le peguen una mirada y me comenten sobre qué puede estar causando que, si bien se ejecuta la consulta a la base de datos y el ExecuteNonQuery me indica que se ha agregado una nueva fila a la tabla en cuestión, cuando voy a revisar los datos de la misma, no aparecen los datos que supuestamente se habían insertado.

     

         consultaDeUsuario = new SqlConnection(f1.conexion);
         consultaDeUsuario.Open();
         agregarUsuario = consultaDeUsuario.CreateCommand();
         agregarUsuario.CommandText = "INSERT INTO ingreso VALUES ('uno','dos','tres','cuatro','cinco','F')";
         agregarUsuario.ExecuteNonQuery();
         int nuevoUsuario = agregarUsuario.ExecuteNonQuery();
         MessageBox.Show("Hola, " + nuevoUsuario+" registro agregado");
         consultaDeUsuario.Close();
    

    Notas:

     

    • f1 es el formulario donde se encuentra la cadena de conexión a la base de datos.
    • Los tipos de datos para cada campo son:
    1. usuario, pass, nombre, apellido, rol: nvarchar(50)
    2. sexo: nvarchar(1)

    Gabriel A. Cánepa
    Wednesday, August 10, 2011 4:10 PM

Answers

  • Parece todo en orden.

    Nos puedes pasar los datos de conexión ?.

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Wednesday, August 10, 2011 4:34 PM
  • Hola. Intenta con este código a ver que tal te va:

            if (contarUsuario == 0)
            {
              consultaDeUsuario = new SqlConnection(f1.conexion);
              agregarUsuario = new SqlCommand("INSERT INTO ingreso VALUES ('uno','dos','tres','cuatro','cinco','F')";
              agregarUsuario.CommandType = CommandType.Text;
              consultaDeUsuario.Open();
    //        agregarUsuario.ExecuteNonQuery();
              int nuevoUsuario = agregarUsuario.ExecuteNonQuery();
              MessageBox.Show("Hola, " + nuevoUsuario+" registro agregado");
              consultaDeUsuario.Close();
            }
            else
            {
              MessageBox.Show("Ya existe el usuario");
            }

    Comenté la primera instrucción del ExecuteNonQuery porque parece que la estás haciendo dos veces...

    Nos cuentas...

    Saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    Wednesday, August 10, 2011 8:14 PM

All replies

  • Parece todo en orden.

    Nos puedes pasar los datos de conexión ?.

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Wednesday, August 10, 2011 4:34 PM
  • Parece todo en orden.

    Nos puedes pasar los datos de conexión ?.

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    Wednesday, August 10, 2011 4:34 PM
  • Opino lo mismo que Daniel... ¿Tal vez falta cerrar la conexión?

    Saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    Wednesday, August 10, 2011 4:37 PM
  • Guillermo y Daniel,

    La conexión a la base de datos es la siguiente:

     

    string conexion="Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\MiMercadito.mdf;Integrated Security=True;User Instance=True";
    

     


    Dicha cadena se encuentra en un formulario aparte, y cada vez que necesito utilizarla, creo una instancia de dicho formulario llamada f1 (como les comentaba en el primer mensaje).

    Lo curioso de todo esto es que en el mismo formulario donde tengo la consulta que no funciona correctamente, tengo la siguiente con la que no tengo ningún problema (la utilizo para ver si en la base de datos ya existe un usuario con el mismo nombre):

     

      string consultaUsuarioExiste = "SELECT COUNT (usuario) FROM ingreso WHERE (usuario='"+txtUsuarioOpciones.Text+"')";
    consultaDeUsuario = new SqlConnection(f1.conexion); chequearUsuario = new SqlCommand(consultaUsuarioExiste, consultaDeUsuario); consultaDeUsuario.Open(); chequearUsuario.ExecuteScalar(); int contarUsuario = Convert.ToInt32(chequearUsuario.ExecuteScalar()); consultaDeUsuario.Close();

     

    La lógica es la siguiente: si el entero contarUsuario es igual a 0, entra al bloque donde se encuentra la consulta que "no funciona".

    Por ejemplo, si deseo agregar un nuevo usuario (con la consulta que no me agrega los registros a la base de datos) y pongo a propósito un nombre de usuario que ya existe (el cual agrego directamente desde SQL Server), obtengo lo siguiente:

    El código completo del condicional es el siguiente:

            if (contarUsuario == 0)
            {
              consultaDeUsuario = new SqlConnection(f1.conexion);
              consultaDeUsuario.Open();
              agregarUsuario = consultaDeUsuario.CreateCommand();
              agregarUsuario.CommandText = "INSERT INTO ingreso VALUES ('uno','dos','tres','cuatro','cinco','F')";
              agregarUsuario.ExecuteNonQuery();
              int nuevoUsuario = agregarUsuario.ExecuteNonQuery();
              MessageBox.Show("Hola, " + nuevoUsuario+" registro agregado");
              consultaDeUsuario.Close();
            }
            else
            {
              MessageBox.Show("Ya existe el usuario");
            }

    La verdad que este asunto me tiene intrigado...


    Gabriel A. Cánepa

    Wednesday, August 10, 2011 5:40 PM
  • Hola. Intenta con este código a ver que tal te va:

            if (contarUsuario == 0)
            {
              consultaDeUsuario = new SqlConnection(f1.conexion);
              agregarUsuario = new SqlCommand("INSERT INTO ingreso VALUES ('uno','dos','tres','cuatro','cinco','F')";
              agregarUsuario.CommandType = CommandType.Text;
              consultaDeUsuario.Open();
    //        agregarUsuario.ExecuteNonQuery();
              int nuevoUsuario = agregarUsuario.ExecuteNonQuery();
              MessageBox.Show("Hola, " + nuevoUsuario+" registro agregado");
              consultaDeUsuario.Close();
            }
            else
            {
              MessageBox.Show("Ya existe el usuario");
            }

    Comenté la primera instrucción del ExecuteNonQuery porque parece que la estás haciendo dos veces...

    Nos cuentas...

    Saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    Wednesday, August 10, 2011 8:14 PM
  • Guillermo, te agradezco un montón por tomarte nuevamente el tiempo para contestar mi pregunta y darme una mano.

    Yo había olvidado mencionar que anteriormente había tratado de comentar esa misma línea que vos decís para ver qué pasaba, pero obtenía los mismos resultados. Creo que se debe a que en la línea comentada ejecuta el comando SQL propiamente dicho para la instrucción INSERT en este caso, y en la siguiente simplemente asigna al entero nuevoUsuario la cantidad de filas afectadas por dicho comando... pero ¡también vuelve a ejecutar el comando, por lo que se agrega el nuevo registro a la base de datos dos veces! Así que, si bien esto no influye en el inconveniente original que planteé, me ayudaste a descubrir un bug potencial en la aplicación.

    Una buena noticia: se me dio por buscar un programa para visualizar los contenidos del archivo de la base de datos (en mi caso se llama MiMercadito.mdf). Encontré uno gratuito muy bueno, el SQL MDF Viewer 1.0... Luego de la instalarlo, busco el archivito de la base de datos, y ¡voilá!... el registro que acababa de agregar, ¡ESTABA AHÍ!

    Probé iniciar sesión desde el formulario de login, y ¡todo bien! Pero el tema sigue siendo, ¿por qué no se visualizarán los cambios en la base de datos viéndola desde el Visual Studio? Más abajo están las capturas de pantalla con sus descripciones correspondientes. Parece ser que la base de datos según la veo desde el Visual Studio es la que se ubica en la carpeta raíz del proyecto, mientras que el archivo donde inserto los nuevos registros es la que se encuentra en la carpeta Debug.

    EDITADO: Confirmé mis sospechas. Abrí los dos archivos .mdf a los que hago referencia en el párrafo anterior, y efectivamente el que se encuentra en la raíz del proyecto tiene los tres registros que puedo ver desde el Visual Studio, mientras que el otro (el de la carpeta Debug) tiene todos los datos que voy agregando.

    CAPTURA N° 1: Agrego el registro con los datos que se pueden ver en el formulario (ACLARACIÓN: el formulario todavía está muy crudo, tengo que enmascarar el campo de contraseña, utilizar un dropdown box para el rol y el sexo, por ejemplo)

    CAPTURA N° 2: Ingreso los datos en el formulario de login, donde puedo ver que el programa toma los datos de usuario y rol (que se muestran en el título del mensaje de bienvenida) y del sexo del usuario (muestra Bienvenido)


    Gabriel A. Cánepa
    Thursday, August 11, 2011 12:39 PM
  • CAPTURAS N° 3a y 3b: Registro agregado en la primer captura. Base de datos abierta con SQL MDF Viewer. (Tuve que hacer dos capturas porque el programa no permite maximizarse. Ambas capturas están en una misma fila o registro)


    Gabriel A. Cánepa
    Thursday, August 11, 2011 12:41 PM
  • Finalmente,

    CAPTURA N° 4: Vista de la raíz del proyecto, el archivo MiMercadito.mdf es el que muestra Visual Studio.

    CAPTURA N° 5: Vista del directorio Debug del proyecto, donde se genera el ejecutable. Creo que la primera vez que se compila el programa, se copia el archivo MiMercadito.mdf desde la raíz del proyecto, y en sucesivas compilaciones trabaja desde la carpeta Debug. Pienso esto porque ambos archivos tienen datos diferentes de modificación (vistos con la opción propiedades del menú contextual de cada uno).

    (VER SIGUIENTE MENSAJE)

    Así que podemos dar por resuelto el tema, voy a marcar como respuestas tanto el aporte de Guillermo como el de Daniel.

    Al mismo tiempo, espero sus sugerencias en cuanto a la lógica de la programación, a la manera de hacer las preguntas... en fin, cualquier cosa que puedan compartir conmigo que pueda enriquecerme como persona y "futuro desarrollador".

    Saludos!


    Gabriel A. Cánepa

    Thursday, August 11, 2011 12:46 PM
  • IMAGEN DE LA CAPTURA N° 5


    Gabriel A. Cánepa
    Friday, August 12, 2011 12:00 PM