none
Problema al generar ID de usuario para guardar registro C# y MySql

    Question

  • Saludos nuevamente, tengo un problema respecto al generar un ID de empleado, automaticamente.
    Cuando ejecuto mi aplicación, muestra el ID nuevo generado para registrar, una vez hecha ésta me debe de generar un nuevo ID, pero no lo hace, tengo que cerrar y abrir nuevamente mi aplicación para que genere el nuevo ID.

    Aquí está mi código, espero puedan ayudarme y decir que parte del código está mal o falta agregar.

     

         private void button2_Click(object sender, EventArgs e)
            {
                  
                    MySqlTransaction transaccion;
                  
                    MemoryStream ms = null;
                    string vsql = "";
                    Boolean VsiGuardo= false;
                    cmd = new MySqlCommand();
                    cn.Close();
                    cn.Open();
                    transaccion = cn.BeginTransaction(IsolationLevel.ReadCommitted);
    
                    try
                    {
                          if (button2.Text == "G u a r d a r")
                        {
                        cmd.Connection = cn;
                        cmd.Transaction = transaccion;
                        cmd.Parameters.AddWithValue("@id", txtcoduser.Text);
                        cmd.Parameters.AddWithValue("@login", txtuser.Text);
                        cmd.Parameters.AddWithValue("@password", txtpass.Text);
                        cmd.Parameters.AddWithValue("@coduser", txtcodemp.Text);
                        cmd.Parameters.AddWithValue("@fecha", DateTime.Now);
    
                       
                            if (txtpass.Text.Trim() == txtpass2.Text.Trim())
                            {
                             
                                vsql = " INSERT INTO usuario (id,login,password,coduser,fecha) values (" +
                                "@id,@login,@password,@coduser,@fecha)";
                                cmd.CommandText = vsql;
                                cmd.ExecuteNonQuery();
                                transaccion.Commit();
                                cn.Close();
    
                              
    
                                MessageBox.Show("DATOS GUARDADOS EXITOSAMENTE");
                                cn.Open();
                                
                                button2.Enabled = false;
                                btnNuevo.Enabled = false;
                                button4.Enabled = false;
                               genNumfac();
    
                            }
                            else
                            {
                                MessageBox.Show("CONTRASEÑAS NO COINCIDEN");
                            }
                          
                        }
                        else
                        {
                           
                            cmd.Connection = cn;
                            if (txtpass.Text.Trim() == txtpass2.Text.Trim())
                            {
                                vsql = " UPDATE usuario SET login='" + txtuser.Text + "',password='" + txtpass.Text + "' WHERE id='" + txtcoduser.Text.Trim() + "'";
                                cmd.CommandText = vsql;
                                cmd.ExecuteNonQuery();
                                transaccion.Commit();
                                cn.Close();
                                VsiGuardo = true;
                         
                                MessageBox.Show("DATOS ACTUALIZADOS EXITOSAMENTE");
                               
                                button2.Enabled = false;
                                btnNuevo.Enabled = false;
                                button4.Enabled = false;
    
                            }
                            else
                            {
                                MessageBox.Show("CONTRASEÑAS NO COINCIDEN");
                            }
                        }
                    }
                    catch (MySqlException ex)
                    {
                        VsiGuardo = false;
                        transaccion.Rollback();
                        throw ex;
                    }
                    finally
                    {
    
                        transaccion.Dispose();
                        cmd.Dispose();
                    }
          
                    cn.Close();
    
            }
    


    Todo el código está dentro del boton Guardar (button2)

     

    ¿Acaso mi problema es debido al cn.Open(); y/o cn.Close(); ?

     

    Saludos!

     

    Friday, December 09, 2011 12:01 AM

Answers

  • lo que hace es génerar una ID: USE01, USE02,

    porque pones USEXX, eso es simplemente complicarse la vida de forma gratuita

    porque simplemente no es un numero secuencial un campo numerico simple, porque el USE como prefijo

    es mas porque no un autonumerico, sin es lo ams natural que existe para estos casos

     

    me manda el mensaje de "Datos actualizados..."

    no has evaluado si este if

    if (button2.Text == "G u a r d a r")

    se cumple ?

    es bastante delicada la tecnica que aplciar para detectar si debe insertar o actualizar

    no creo que usar el texto de un boton sea lo seguro

    [ADO.NET] – Parte 5 - Ejemplos Simples – Opereraciones CRUD

    como veras deberias tomar la entidad y evaluar si existe o no para determinar que operacion realizar

    si tienes un id este existe entonces envias el update, si no tienes un id envias uno por defecto, quizas el cero, evaluando negativo por lo tanto invicaras al insert

     

    pero valida quizas usando algun breakpoint en el codigo que camino toma, seguramente este ingresando siempre por la actualizacion, porque ese if del texto del boton no valida correctamente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by StevenLlaja Sunday, December 11, 2011 10:43 PM
    Friday, December 09, 2011 2:57 AM
  • te dejo el codigo algo mas optimizado, por si te interesa

     

     private void button2_Click(object sender, EventArgs e)
    {
    	  
    	try
    	{
    		if (txtpass.Text.Trim() != txtpass2.Text.Trim())
    		{
    			MessageBox.Show("CONTRASEÑAS NO COINCIDEN");
    			return;
    		}
    		cn.Open();
    		
    		if (button2.Text == "G u a r d a r")
    		{
    		   
    			string queryINSERT = @"INSERT INTO usuario (id,login,password,coduser,fecha) "
    						"values (?id,?login,?password,?coduser,?fecha)";
    			
    			using(MySqlCommand cmd = new MySqlCommand(queryINSERT, cn))
    			{
    				cmd.Parameters.AddWithValue("?id", txtcoduser.Text);
    				cmd.Parameters.AddWithValue("?login", txtuser.Text);
    				cmd.Parameters.AddWithValue("?password", txtpass.Text);
    				cmd.Parameters.AddWithValue("?coduser", txtcodemp.Text);
    				cmd.Parameters.AddWithValue("?fecha", DateTime.Now);
    				
    				cmd.ExecuteNonQuery();
    			}
    			
    			MessageBox.Show("DATOS GUARDADOS EXITOSAMENTE");
    			
    			genNumfac();
    
    		}
    		else
    		{
    		   
    			string queryUPDATE = "UPDATE usuario SET login= ?login,password=?password WHERE id=?id";
    			
    			using(MySqlCommand cmd = new MySqlCommand(queryUPDATE, cn))
    			{
    				cmd.Parameters.AddWithValue("?login", txtuser.Text);
    				cmd.Parameters.AddWithValue("?password", txtpass.Text);
    				cmd.Parameters.AddWithValue("?id", txtcoduser.Text);
    				
    				cmd.ExecuteNonQuery();
    			}
    			
    			MessageBox.Show("DATOS ACTUALIZADOS EXITOSAMENTE");
    		   
    
    		}
    	}
    	catch
    	{
    		throw;
    	}
    	finally
    	{
    		button2.Enabled = false;
    		btnNuevo.Enabled = false;
    		button4.Enabled = false;
    		cn.Close();
    	}
    
    }
    


     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Friday, December 09, 2011 12:20 AM

All replies

  • hola

    bueno veo varios puntos que remarcar

    - primero es ponerse de acuerdo en la forma de codificar, si para el INSERT usas parametro, porque en el UPDATE concatenas la query en el string ?

    no tiene sentido, si sabes usar parametros porque no lo aplcias de igual forma

     

    - segundo, porque defines los parametros antes de definir la query en el command, es un tema de orden en el codigo, se supone que para cada query corresponden tales parametros, para facilitar la lectura

     

    - tercero, no dejes codigo huerfano, porque este puede casuar errores, por ejemplo la linea

    MemoryStream ms = null;

    para que esta ? se prolijo al programar es fundamental

     

    para que llevas el

    Boolean VsiGuardo= false;

    si lo declaras local en el evento y nunca lo retornas, no tiene sentido ni utilidad esa variable

     

     

    - cuarto, si solo vas a actualizar o insertar una unica tabla no necesitas de una transaccion, esta se usa cuando debes asegurar la consistencia de los datos ala actualziar varias tablas o cuando vas a registrar en bloque muchos registros en una unica tabla

    alterar un unico registro no requiere transaccion

     

    - quinto, si la db que usas es mysql porque los parametros los defines con @, mysql usa ? para definir parametros

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Friday, December 09, 2011 12:12 AM
  • te dejo el codigo algo mas optimizado, por si te interesa

     

     private void button2_Click(object sender, EventArgs e)
    {
    	  
    	try
    	{
    		if (txtpass.Text.Trim() != txtpass2.Text.Trim())
    		{
    			MessageBox.Show("CONTRASEÑAS NO COINCIDEN");
    			return;
    		}
    		cn.Open();
    		
    		if (button2.Text == "G u a r d a r")
    		{
    		   
    			string queryINSERT = @"INSERT INTO usuario (id,login,password,coduser,fecha) "
    						"values (?id,?login,?password,?coduser,?fecha)";
    			
    			using(MySqlCommand cmd = new MySqlCommand(queryINSERT, cn))
    			{
    				cmd.Parameters.AddWithValue("?id", txtcoduser.Text);
    				cmd.Parameters.AddWithValue("?login", txtuser.Text);
    				cmd.Parameters.AddWithValue("?password", txtpass.Text);
    				cmd.Parameters.AddWithValue("?coduser", txtcodemp.Text);
    				cmd.Parameters.AddWithValue("?fecha", DateTime.Now);
    				
    				cmd.ExecuteNonQuery();
    			}
    			
    			MessageBox.Show("DATOS GUARDADOS EXITOSAMENTE");
    			
    			genNumfac();
    
    		}
    		else
    		{
    		   
    			string queryUPDATE = "UPDATE usuario SET login= ?login,password=?password WHERE id=?id";
    			
    			using(MySqlCommand cmd = new MySqlCommand(queryUPDATE, cn))
    			{
    				cmd.Parameters.AddWithValue("?login", txtuser.Text);
    				cmd.Parameters.AddWithValue("?password", txtpass.Text);
    				cmd.Parameters.AddWithValue("?id", txtcoduser.Text);
    				
    				cmd.ExecuteNonQuery();
    			}
    			
    			MessageBox.Show("DATOS ACTUALIZADOS EXITOSAMENTE");
    		   
    
    		}
    	}
    	catch
    	{
    		throw;
    	}
    	finally
    	{
    		button2.Enabled = false;
    		btnNuevo.Enabled = false;
    		button4.Enabled = false;
    		cn.Close();
    	}
    
    }
    


     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Friday, December 09, 2011 12:20 AM
  • algo que no has comentado es que hace el metodo

    genNumfac()

    y si la tabla tiene definido el id como autonumerico

    porque si es autonumerico, o identity

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/f0689e4f-469c-4891-9315-5ca86331dab1

    deberias usar el

    SELECT LAST_INSERT_ID();

    para recuperarlo, esto lo haces como se menciona en la pregunta del link sobre el mismo tema

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Friday, December 09, 2011 12:23 AM
  • Saludos @Leandro, gracias por esas aclaraciones, las tendré muy en cuenta con respecto al "@" y "?" no estaba al tanto de eso, y la del código huerfano.

    Respondiendo a lo que me preguntas respecto a genNumfac(), lo que hace es génerar una ID: USE01, USE02, así según cada registro se vaya haciendo, no está en auto_increment.

    Con respecto a tu código, lo he probado, y pues, ahora mi problema es que cuando quiero guardar el nuevo registro, me manda el mensaje de "Datos actualizados...", más no el mensaje de guardado, y no afecta en nada a la BD, pero cuando en realidad si quiero actualizar, lo hace. ¿Cuál podría ser la falla?

    Saludos.
    Friday, December 09, 2011 2:30 AM
  • lo que hace es génerar una ID: USE01, USE02,

    porque pones USEXX, eso es simplemente complicarse la vida de forma gratuita

    porque simplemente no es un numero secuencial un campo numerico simple, porque el USE como prefijo

    es mas porque no un autonumerico, sin es lo ams natural que existe para estos casos

     

    me manda el mensaje de "Datos actualizados..."

    no has evaluado si este if

    if (button2.Text == "G u a r d a r")

    se cumple ?

    es bastante delicada la tecnica que aplciar para detectar si debe insertar o actualizar

    no creo que usar el texto de un boton sea lo seguro

    [ADO.NET] – Parte 5 - Ejemplos Simples – Opereraciones CRUD

    como veras deberias tomar la entidad y evaluar si existe o no para determinar que operacion realizar

    si tienes un id este existe entonces envias el update, si no tienes un id envias uno por defecto, quizas el cero, evaluando negativo por lo tanto invicaras al insert

     

    pero valida quizas usando algun breakpoint en el codigo que camino toma, seguramente este ingresando siempre por la actualizacion, porque ese if del texto del boton no valida correctamente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by StevenLlaja Sunday, December 11, 2011 10:43 PM
    Friday, December 09, 2011 2:57 AM
  • Hola nuevamente, @Leandro, tu código me ha servido, y guardo/actualizo perfectamente el registro, pero el problema es que tengo que agregarle yo el ID, además de que cuando hago la busqueda del DataGridView para actualizar el registro, en el textbox del ID no me aparece el número sino esto: "System.Bite[]" y ahí yo debo poner el ID del usuario a actualizar. No lo entiendo.

    Esta es mi consulta dentro del boton Buscar que al hacer la busqueda del empleado de mi DGV, me muestre los datos del empleado (tabla empleado, area,cargo,usuario):

     DataTable dt = new DataTable();
      dt = mostrar("SELECT e.cod,e.appat, e.apmat, e.nombre,e.img, a.Nombre AS area, c.Nombre AS cargo, ifnull((select u.id from usuario u where u.coduser=e.cod),'') as CODU,ifnull((select u.login from usuario u where u.coduser=e.cod),'') as LOGIN, ifnull((select u.password from usuario u where u.coduser=e.cod),'') as PASS FROM empleado e inner join area a on a.codarea=e.codarea inner join cargo c on c.codcargo=e.codcargo where cod like'" + frm_busqueda.Filtro + "'");
                     
                        txtcodemp.Text = dt.Rows[0]["cod"] + "";
                        txtappat.Text = dt.Rows[0]["appat"] + "";
                        txtapmat.Text = dt.Rows[0]["apmat"] + "";
                        txtnom.Text = dt.Rows[0]["nombre"] + "";
                        txtarea.Text = dt.Rows[0]["area"] + "";
                        txtcargo.Text = dt.Rows[0]["cargo"] + "";
                         txtcoduser.Text =dt.Rows[0]["CODU"]+"";
                          txtuser.Text = dt.Rows[0]["login"] + "";
                            txtpass.Text = dt.Rows[0]["pass"] + "";
    
    Saludos!
    Friday, December 09, 2011 4:22 AM
  • hola

    el primer problema que detecto y veo que no has seguido ninguno de los consejos de los ejemplos

    es que no usas parametro, estas concatenando la query en un string y todo por culpa de ese metodo mostrar() que creas, para "ayudarte", pero que en realidad termina entorpeciando la programacion

    porque no creas metodo basados en el negocioy en lugar de mostrar() no sea un ObtenerEmpleado() en donde le pases el codigo y este usando parametro en la quey ejecute la accion

    resumen adapta el mostrar() para usar parametros

     

    ademas noto que usas mal el LIKE, si es una busqueda por aproximacion donde estan los comodines ?

    where cod like'" + frm_busqueda.Filtro + "'")

    alli falta el %

    http://social.msdn.microsoft.com/Forums/es/vbes/thread/cdebae5d-bfb7-4232-a06b-e6edbb613ff7

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Friday, December 09, 2011 12:09 PM
  • ademas que son estas partes en el codigo

    ifnull((select u.id from usuario u where u.coduser=e.cod),'') as CODU

    deberias usar el LEFT JOIN para relacionar tablas

     

    SELECT e.cod, e.appat, e.apmat, e.nombre,e.img, a.Nombre AS area, c.Nombre AS cargo,
    ifnull(u.id,'') as CODU,
    ifnull(u.login,'') as LOGIN,
    ifnull(u.password,'') as PASS
    FROM empleado e inner join area a on a.codarea=e.codarea
    inner join cargo c on c.codcargo=e.codcargo
    LEFT JOIN usuario u ON  u.coduser=e.cod
    where cod like'" + frm_busqueda.Filtro + "'"

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Friday, December 09, 2011 12:13 PM
  • Gracias por tu tiempo y ayuda @Leandro, he comenzado a corregir algunas cosas de la programación.
    En lo que respecto al generar mi código, al parecer que en mi maquina no lo generaba, cuando lo probé en clase, si funcionaba.

    Saludos.
    Sunday, December 11, 2011 10:42 PM