none
Validación menor que en sql RRS feed

  • Pregunta

  • Buen día:

    Estoy haciendo una aplicación en c# con conexión a una base de datos  donde envió datos sin embargo necesito validar que esos datos con x identificador no supere cierto valor de dato numérico entero en la base de datos, como podrida hacerlo para que si supera dicho valor no permita ingresar mas datos con ese identificador?.

    Agradezco cualquier ayuda.

    n.Open();
                    cmd.CommandText = "insert into Siembra (IdVariedad,IdBanco,NumeroDePlantas,SemanaProgramada,FechaSiembra) values ('" + comboBox4.Text + "','" + comboBox1.Text + "','" + textBox1.Text + "','" + comboBox7.Text + "','" + dateTimePicker1.Text + "')";
                    cmd.ExecuteNonQuery();
                    cmd.Clone();
                    MessageBox.Show("Datos Guardados Exitosamente", "Datos A BD");
                    cn.Close();

    lunes, 27 de noviembre de 2017 13:32

Respuestas

  • Primero, en lado cliente ponle un "if":

    if (elCampoAControlar<elMaximoValor)
    {
        // Construir el Command
        // mandar el ExecuteNonQuery
    }
    

    Por cierto, tiene muchísimos riesgos concatenar los datos introducidos por el usuario en la sentencia SQL. Se debe parametrizar, y asignar los datos a los parámetros. Deberías convertir a numérico el string del TextBox para asignárselo al parámetro (y en cualquier caso también deberías convertirlo incluso aunque lo concatenes en la sentencia, no es tan bueno como parametrizar pero por lo menos controlará que el valor sea numérico). El resultado de convertir a numérico es eso que you he llamado "elCampoAControlar" en el anterior "if".

    Y otra cosa: ¿por qué haces un cmd.Clone()?¿De qué te sirve clonarlo si no estás usando el clon para nada?

    Segundo, por si se produce algún fallo en el lado cliente y se manda a grabar un dato incorrecto, conviene también validar el valor en la base de datos (además de validarlo en el cliente). Esto se hace poniendo un constraint de tipo CHECK en la creación de la tabla. Si nos pones aquí la sentencia que usaste para crear la tabla, y nos dices cuál es el campo que hay que validar, podemos ponerte aquí cómo sería el CHECK.

    lunes, 27 de noviembre de 2017 13:48
    Moderador
  • Podrías primero enviar una Select que sume los valores que ya existen para ese identificador:

    Select SUM(NumeroDePlantas) where IDBanco=101

    Al valor devuelto le sumas el valor que pretendes grabar, y si el resultado excede el máximo permitido pues entonces no haces la grabación.

    • Marcado como respuesta alejohead viernes, 1 de diciembre de 2017 14:07
    viernes, 1 de diciembre de 2017 12:56
    Moderador
  • Buen día:

    Este es el resultado de la sugerencia sin embargo de be tener algo mal no ejecuta cuando corro el programa no lo permite o no hace nada

     cn.Open();
                string query = @"Select SUM(NumeroDePlantas)where IDBanco = cbxubicacion.Text";
                SqlCommand cmd = new SqlCommand(query, cn);
                cmd.Parameters.AddWithValue("@cbxubicacion.Text","19300");
                int NumeroDePlantas = Convert.ToInt32(cmd.ExecuteScalar());
                cn.Close(); 
    martes, 2 de enero de 2018 19:10
  • Este es el resultado de la sugerencia sin embargo de be tener algo mal

    Sí, claro que tiene algo mal. Te has dejado "cbxubicacion.Text" metido DENTRO de las comillas. Lo que tienes que hacer es evaluar el valor de cbxUbicacion.Text, y el resultado que arroje es lo que tienes que poner dentro del string que tiene la query. Si lo querías parametrizar, tienes que anteponerle una @ para indicar que se trata de un parámetro. Y si no me equivoco, no es lícito que los parámetros contengan un punto, por lo que no puedes llamarle "@cbxubicacion.Text". Podrías llamar al parámetro, por ejemplo "abcdef" (es un nombre "mudo", se puede llamar de cualquier manera sin afectar al resultado, igual que cuando defines una variable):

    string query = @"Select SUM(NumeroDePlantas)where IDBanco = @abcdef";
     SqlCommand cmd = new SqlCommand(query, cn);
     cmd.Parameters.AddWithValue("@abcdef", cbxubicacion.Text);

    martes, 2 de enero de 2018 19:58
    Moderador
  • En medio de la query falta el "FROM nombreDeTabla". Lo siento, cuando te puse mi ejemplo simplemente copié y pegué desde el mensaje anterior y no me fijé en que la sentencia estaba incompleta.
    miércoles, 3 de enero de 2018 16:29
    Moderador
  • El resultado lo tienes dentro de la variable que has llamado "txtnumplantas" (por cierto, te recomiendo que le cambies el nombre porque si empieza por txt da la sensación de que es algún tipo de texto, cuando en realidad es una variable de tipo int). Si la quieres mostrar en un messagebox sería:

    MessageBox.Show(txtnumplantas.ToString());

    • Marcado como respuesta alejohead jueves, 4 de enero de 2018 11:31
    miércoles, 3 de enero de 2018 20:19
    Moderador

Todas las respuestas

  • Primero, en lado cliente ponle un "if":

    if (elCampoAControlar<elMaximoValor)
    {
        // Construir el Command
        // mandar el ExecuteNonQuery
    }
    

    Por cierto, tiene muchísimos riesgos concatenar los datos introducidos por el usuario en la sentencia SQL. Se debe parametrizar, y asignar los datos a los parámetros. Deberías convertir a numérico el string del TextBox para asignárselo al parámetro (y en cualquier caso también deberías convertirlo incluso aunque lo concatenes en la sentencia, no es tan bueno como parametrizar pero por lo menos controlará que el valor sea numérico). El resultado de convertir a numérico es eso que you he llamado "elCampoAControlar" en el anterior "if".

    Y otra cosa: ¿por qué haces un cmd.Clone()?¿De qué te sirve clonarlo si no estás usando el clon para nada?

    Segundo, por si se produce algún fallo en el lado cliente y se manda a grabar un dato incorrecto, conviene también validar el valor en la base de datos (además de validarlo en el cliente). Esto se hace poniendo un constraint de tipo CHECK en la creación de la tabla. Si nos pones aquí la sentencia que usaste para crear la tabla, y nos dices cuál es el campo que hay que validar, podemos ponerte aquí cómo sería el CHECK.

    lunes, 27 de noviembre de 2017 13:48
    Moderador
  • hola

    >>necesito validar que esos datos con x identificador no supere cierto valor de dato numérico entero en la base de datos,

    podrias realizar un SELECT antes del INSERT que aplique la validacion, quizas recuperando el valor y comparandolo con el valor ingresado

    lo que si recomendaria que uses parametros

    string query = @"insert into Siembra (IdVariedad,IdBanco,NumeroDePlantas,SemanaProgramada,FechaSiembra) 
    				values (@IdVariedad,@IdBanco,@NumeroDePlantas,...)";
    SqlCommand cmd = new SqlCommand(query, cn);
    cmd.Parameters.AddWithValue("@IdVariedad", comboBox4.Text);
    cmd.Parameters.AddWithValue("@IdBanco", comboBox1.Text);
    cmd.Parameters.AddWithValue("@NumeroDePlantas", textBox1.Text);
    //resto paretros
    cmd.ExecuteNonQuery();

    no se concatenan en el string los valores

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Jorge TurradoMVP lunes, 27 de noviembre de 2017 15:41
    lunes, 27 de noviembre de 2017 15:39
  • Mil disculpas no supe formular la pregunta:

    Esta es la db, ese id 101 sumando los datos no puede ser mayor a 19300 no importa el numero de veces que inserte unidades de ese id, lo importante es que no supere los 19300 al sumar los datos, como pueden ver en este momento permite ingresar en sumatoria mas de lo que necesito.

    Agradezco su valiosa ayuda.

    viernes, 1 de diciembre de 2017 12:49
  • Podrías primero enviar una Select que sume los valores que ya existen para ese identificador:

    Select SUM(NumeroDePlantas) where IDBanco=101

    Al valor devuelto le sumas el valor que pretendes grabar, y si el resultado excede el máximo permitido pues entonces no haces la grabación.

    • Marcado como respuesta alejohead viernes, 1 de diciembre de 2017 14:07
    viernes, 1 de diciembre de 2017 12:56
    Moderador
  • Buen día:

    En este momento ya hace la validación sin embargo necesito mostrar esa información al usuario, es decir

    Que con el select haga la sumatoria al seleccionar el campo del combobox y lo muestre al usuario podría ser en un lable.

    Agradezco cualquier colaboración.

     

    martes, 5 de diciembre de 2017 12:12
  • >>Que con el select haga la sumatoria al seleccionar el campo del combobox y lo muestre al usuario podría ser en un lable.

    si solo retornas un valor simple usa el ExecuteScalar()

    string query = @"Select SUM(NumeroDePlantas) where IDBanco= @id";
    SqlCommand cmd = new SqlCommand(query, cn);
    cmd.Parameters.AddWithValue("@id", valor);
    
    
    int nroPlantas = Convert.ToInt32(cmd.ExecuteScalar());

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 5 de diciembre de 2017 13:29
  • Buen día:

    Este es el resultado de la sugerencia sin embargo de be tener algo mal no ejecuta cuando corro el programa no lo permite o no hace nada

     cn.Open();
                string query = @"Select SUM(NumeroDePlantas)where IDBanco = cbxubicacion.Text";
                SqlCommand cmd = new SqlCommand(query, cn);
                cmd.Parameters.AddWithValue("@cbxubicacion.Text","19300");
                int NumeroDePlantas = Convert.ToInt32(cmd.ExecuteScalar());
                cn.Close(); 
    martes, 2 de enero de 2018 19:10
  • Este es el resultado de la sugerencia sin embargo de be tener algo mal

    Sí, claro que tiene algo mal. Te has dejado "cbxubicacion.Text" metido DENTRO de las comillas. Lo que tienes que hacer es evaluar el valor de cbxUbicacion.Text, y el resultado que arroje es lo que tienes que poner dentro del string que tiene la query. Si lo querías parametrizar, tienes que anteponerle una @ para indicar que se trata de un parámetro. Y si no me equivoco, no es lícito que los parámetros contengan un punto, por lo que no puedes llamarle "@cbxubicacion.Text". Podrías llamar al parámetro, por ejemplo "abcdef" (es un nombre "mudo", se puede llamar de cualquier manera sin afectar al resultado, igual que cuando defines una variable):

    string query = @"Select SUM(NumeroDePlantas)where IDBanco = @abcdef";
     SqlCommand cmd = new SqlCommand(query, cn);
     cmd.Parameters.AddWithValue("@abcdef", cbxubicacion.Text);

    martes, 2 de enero de 2018 19:58
    Moderador
  • Ok gracias pero ahora parece que debo poner de nuevo la coleccion con bd?

    me genera este error como si no conectara con la base 

    miércoles, 3 de enero de 2018 13:50
  • En medio de la query falta el "FROM nombreDeTabla". Lo siento, cuando te puse mi ejemplo simplemente copié y pegué desde el mensaje anterior y no me fijé en que la sentencia estaba incompleta.
    miércoles, 3 de enero de 2018 16:29
    Moderador
  • Ok mil gracias 

    pero aun no puedo ver el resultado de dicha suma 

    lo puedo hacer con un messagebox alasi como:

    cn.Open();
                string query = @"Select SUM (NumeroDePlantas)FROM Siembra where IdBanco = @id";
                SqlCommand cmd = new SqlCommand(query, cn);
                cmd.Parameters.AddWithValue("@id",cbxubicacion.Text);
                int txtnumplantas = Convert.ToInt32(cmd.ExecuteScalar());          
                cn.Close();

                messagebox.show(id).

    Para que muestre el resultado de la suma.

    De antemano agradezco toda la colaboración.

    miércoles, 3 de enero de 2018 19:21
  • El resultado lo tienes dentro de la variable que has llamado "txtnumplantas" (por cierto, te recomiendo que le cambies el nombre porque si empieza por txt da la sensación de que es algún tipo de texto, cuando en realidad es una variable de tipo int). Si la quieres mostrar en un messagebox sería:

    MessageBox.Show(txtnumplantas.ToString());

    • Marcado como respuesta alejohead jueves, 4 de enero de 2018 11:31
    miércoles, 3 de enero de 2018 20:19
    Moderador
  • Mil gracias quedo como lo necesitaba:) 
    jueves, 4 de enero de 2018 11:32