none
Error Al Ejecutar Sentencia SQL Desde C# RRS feed

  • Pregunta

  • Hola Estoy Desarrollando una aplicación donde debo guardar, modificar y eliminar registros desde una base de datos

    mi problema es que cada vez que ejecuto la función guardar o la función modificar me da error, y no me guarda o modifica los datos, desconozco el error, por que a veces si me guarda o modifica, y eso me esta generando muchos problemas.

    aquí el código para realizar el registro.

            public void agregarRegistro(string codigo, string apellidos,string nombre,string fechaN, string sexo, string Telefono, string celular, string ciudad, string universidad, string carrera)
            {
                string sentenciaSql = string.Format("insert into AgendaAmigos(Codigo,Apellidos,Nombres,FechaNacimiento,Sexo,Telefono,Celular,Ciudad,Universidad,Carrera) values({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}')",codigo,apellidos,nombre,fechaN,sexo,Telefono,celular,ciudad,universidad,carrera);
                try
                {
                    connection.Open();
                    comandosSql = new SqlCommand(sentenciaSql,connection);
                    comandosSql.ExecuteNonQuery();
                    connection.Close();
                    MessageBox.Show("Datos Registrados Correctamente");
                }catch(Exception ex)
                {
                    connection.Close();
                    MessageBox.Show("Error Al Registrar");
                }
            }

    No entiendo por que a veces me funciona y a veces no.

    miércoles, 22 de enero de 2020 18:16

Respuestas

  • Hola Neoshock:

    Amén de lo que te ha dicho Alberto, que lo tienes que tomar al pie de la letra. También tienes que cambiar la manera de realizar la inserción de los registros, y los tipos de datos.

    Me explico un poco mejor:

    Según se deduce de tu sentencia de inserción en la base de datos tienes una tabla tal que:

    CREATE TABLE AgendaAmigos
    (Codigo          INT, 
     Apellidos       VARCHAR(100), 
     Nombres         VARCHAR(100), 
     FechaNacimiento VARCHAR(100), 
     Sexo            VARCHAR(100), 
     Telefono        VARCHAR(100), 
     Celular         VARCHAR(100), 
     Ciudad          VARCHAR(100), 
     Universidad     VARCHAR(100), 
     Carrera         VARCHAR(100)
    );
    GO

    Donde sólo el código es un campo numérico y el resto son varchar o nvarchar.

    Es bastante probable, que no sea este tu escenario, y que por ejemplo el campo FechaNacimiento sea de un tipo Date o similar.

    Aunque es válido insertar una fecha como si fuera un string, si se lo pasas correctamente formateado, también es posible, que te genere errores. O le pasas strings que son más grandes de lo que coge en la tabla, ya que el usuario ha puesto más de 100 caracteres en un campo y la sentencia los va a transmitir pero el Sql te va a devolver un error.

    Una manera un poco más correcta podría ser:

    public void agregarRegistro(string codigo, string apellidos, string nombre, string fechaN, string sexo, string Telefono, string celular, string ciudad, string universidad, string carrera)
            {
                
                try
                {
                    string CSTR = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=Estudiantes;Server=ESQUINERO";
                    string sentenciaSql = "insert into AgendaAmigos(Codigo,Apellidos,Nombres,FechaNacimiento,Sexo,Telefono,Celular,Ciudad,Universidad,Carrera) values(@codigo, @apellidos, @nombre, @fechaN, @sexo, @Telefono, @celular, @ciudad, @universidad, @carrera);";
                    using (SqlConnection CN = new SqlConnection(CSTR))
                    {
    
                        using (SqlCommand cmd = new SqlCommand(sentenciaSql, CN))
                        {
                            cmd.Parameters.AddWithValue("@codigo",Convert.ToInt32(codigo)); // Ojo no pasar valores directamente que puedan generar un error.
                            cmd.Parameters.Add("@apellidos", SqlDbType.VarChar, 100).Value = apellidos;
                            cmd.Parameters.Add("@nombre", SqlDbType.VarChar, 100).Value = nombre;
                            cmd.Parameters.Add("@fechaN", SqlDbType.VarChar, 100).Value = fechaN;
                            cmd.Parameters.Add("@sexo", SqlDbType.VarChar, 100).Value = sexo;
                            cmd.Parameters.Add("@Telefono", SqlDbType.VarChar, 100).Value = Telefono;
                            cmd.Parameters.Add("@celular", SqlDbType.VarChar, 100).Value = celular;
                            cmd.Parameters.Add("@ciudad", SqlDbType.VarChar, 100).Value = ciudad;
                            cmd.Parameters.Add("@universidad", SqlDbType.VarChar, 100).Value = universidad;
                            cmd.Parameters.Add("@carrera", SqlDbType.VarChar, 100).Value = carrera;
                            CN.Open();
                            cmd.ExecuteNonQuery();
                        }
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                
    
            }
    

    Te he puesto las dos formas de pasar parámetros (add y addWithValue).

    Y aunque en el ejemplo esta hecho así, no le pases directamente valores, que pueden generar un error. Como el caso del código, que al método llega como string y lo convierto en Int.

    Primero utiliza tryParse y si es bueno, entonces continúas.

    Sql Parameters

    https://docs.microsoft.com/es-es/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=netframework-4.8

    Espero te ayude

    • Propuesto como respuesta Alberto PoblacionMVP jueves, 23 de enero de 2020 7:54
    • Marcado como respuesta Neoshock sábado, 25 de enero de 2020 21:04
    jueves, 23 de enero de 2020 6:46

Todas las respuestas

  • Un detalle absolutamente vital para resolver este tipo de problemas es nunca decir "Me da error". Siempre hay que escribir cuál es el error. Copia aquí con toda precisión el mensaje de error completo, exacto y detallado.

    Por supuesto, para eso es preciso que veas el error. Puedes poner un punto de ruptura con el debugger y ejecutar paso a paso, o cambiar las opciones de Visual Studio para que se te pare en el error en lugar de meterse en el "catch", o editar el catch para que el mensaje presente el error. Pero en cualquier caso, nunca dejes que los errores se pasen sin dejar constancia en ningún sitio de cuál es el error. Si no quieres que lo vea el usuario, entonces guárdalo en un archivo de registro, pero no pongas un catch que se "trague" el error sin dejar registrados todos los detalles del mismo.

    miércoles, 22 de enero de 2020 19:24
  • Hola Neoshock:

    Amén de lo que te ha dicho Alberto, que lo tienes que tomar al pie de la letra. También tienes que cambiar la manera de realizar la inserción de los registros, y los tipos de datos.

    Me explico un poco mejor:

    Según se deduce de tu sentencia de inserción en la base de datos tienes una tabla tal que:

    CREATE TABLE AgendaAmigos
    (Codigo          INT, 
     Apellidos       VARCHAR(100), 
     Nombres         VARCHAR(100), 
     FechaNacimiento VARCHAR(100), 
     Sexo            VARCHAR(100), 
     Telefono        VARCHAR(100), 
     Celular         VARCHAR(100), 
     Ciudad          VARCHAR(100), 
     Universidad     VARCHAR(100), 
     Carrera         VARCHAR(100)
    );
    GO

    Donde sólo el código es un campo numérico y el resto son varchar o nvarchar.

    Es bastante probable, que no sea este tu escenario, y que por ejemplo el campo FechaNacimiento sea de un tipo Date o similar.

    Aunque es válido insertar una fecha como si fuera un string, si se lo pasas correctamente formateado, también es posible, que te genere errores. O le pasas strings que son más grandes de lo que coge en la tabla, ya que el usuario ha puesto más de 100 caracteres en un campo y la sentencia los va a transmitir pero el Sql te va a devolver un error.

    Una manera un poco más correcta podría ser:

    public void agregarRegistro(string codigo, string apellidos, string nombre, string fechaN, string sexo, string Telefono, string celular, string ciudad, string universidad, string carrera)
            {
                
                try
                {
                    string CSTR = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=Estudiantes;Server=ESQUINERO";
                    string sentenciaSql = "insert into AgendaAmigos(Codigo,Apellidos,Nombres,FechaNacimiento,Sexo,Telefono,Celular,Ciudad,Universidad,Carrera) values(@codigo, @apellidos, @nombre, @fechaN, @sexo, @Telefono, @celular, @ciudad, @universidad, @carrera);";
                    using (SqlConnection CN = new SqlConnection(CSTR))
                    {
    
                        using (SqlCommand cmd = new SqlCommand(sentenciaSql, CN))
                        {
                            cmd.Parameters.AddWithValue("@codigo",Convert.ToInt32(codigo)); // Ojo no pasar valores directamente que puedan generar un error.
                            cmd.Parameters.Add("@apellidos", SqlDbType.VarChar, 100).Value = apellidos;
                            cmd.Parameters.Add("@nombre", SqlDbType.VarChar, 100).Value = nombre;
                            cmd.Parameters.Add("@fechaN", SqlDbType.VarChar, 100).Value = fechaN;
                            cmd.Parameters.Add("@sexo", SqlDbType.VarChar, 100).Value = sexo;
                            cmd.Parameters.Add("@Telefono", SqlDbType.VarChar, 100).Value = Telefono;
                            cmd.Parameters.Add("@celular", SqlDbType.VarChar, 100).Value = celular;
                            cmd.Parameters.Add("@ciudad", SqlDbType.VarChar, 100).Value = ciudad;
                            cmd.Parameters.Add("@universidad", SqlDbType.VarChar, 100).Value = universidad;
                            cmd.Parameters.Add("@carrera", SqlDbType.VarChar, 100).Value = carrera;
                            CN.Open();
                            cmd.ExecuteNonQuery();
                        }
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                
    
            }
    

    Te he puesto las dos formas de pasar parámetros (add y addWithValue).

    Y aunque en el ejemplo esta hecho así, no le pases directamente valores, que pueden generar un error. Como el caso del código, que al método llega como string y lo convierto en Int.

    Primero utiliza tryParse y si es bueno, entonces continúas.

    Sql Parameters

    https://docs.microsoft.com/es-es/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=netframework-4.8

    Espero te ayude

    • Propuesto como respuesta Alberto PoblacionMVP jueves, 23 de enero de 2020 7:54
    • Marcado como respuesta Neoshock sábado, 25 de enero de 2020 21:04
    jueves, 23 de enero de 2020 6:46
  • Hey amigo, Muchas Gracias me acabas de ayuda Muchisimo
    sábado, 25 de enero de 2020 21:04