none
Consulta con Between RRS feed

  • Pregunta

  • Tengo una pequeña duda, que es cómo puedo realizar una consulta SQL con un between de Precios.

    Me explico, tengo ciertos anuncios, con ciertos precios, y con un slider quiero realizar la consulta en un rango de precios, pero cuando escribo la consulta y este rango de precios los guardo en 2 textbox, me tira errores, pero cuando pongo los precios manualmente me funciona.

     private void ObtenerPublicaciones()
            {
                string cs = ConfigurationManager.ConnectionStrings["BDTCS"].ConnectionString;
                using (SqlConnection con = new SqlConnection(cs))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandText = "Select FOTO_USUARIO, UBIC_PUBLIC, PRECIO_PUBLIC, ID_PUBLIC from Usuario INNER JOIN  Publicacion on Publicacion.ID_USU = Usuario.ID_USU where PRECIO_PUBLIC between" + Convert.ToInt32(TxtMaximo.Text) + "and" + Convert.ToInt32(TxtMinimo.Text) + "ORDER BY Usuario.ID_USU DESC";
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    con.Open();
    
                    DataTable ImagenesPublic = new DataTable();
                    ImagenesPublic.Load(cmd.ExecuteReader());
    
                    repeater1.DataSource = ImagenesPublic;
                    repeater1.DataBind();
    
                    con.Close();
                }
            }
    Generalmente he visto ejemplos siempre relacionados con fechas y utilizar los StoreProcedure(Procedimientos Almacenados), pero no me funcionan con lo que estoy buscando...

    He tratado tambien de guardar los datos que me arrojan los textbox en variables, para no tener que usar directamente el textbox y me dice:

    "La cadena de entrada no tiene el formato correcto.",

    "Se especificó una expresión no booleana en un contexto donde se esperaba una condición, cerca de 'betweenandORDER'."


    DiegoThonCortes


    • Editado DiegoThon sábado, 25 de agosto de 2018 19:56
    sábado, 25 de agosto de 2018 19:54

Respuestas

  • Ya veo, pero no defines en que momento llamas al método  

    ObtenerPublicaciones(), en que evento , en el click de un botón , al momento de deslizar los slider, porque pueda ser que este llegando un textbox en blanco por lo que te genera el error,deberías validarlo desde tu capa de presentación ,como lo vienes haciendo podrías hacer que te ponga un valor por defecto como 0 si esta vacío el textbox

     private void ObtenerPublicaciones()
            {
                int numero1;
                int numero2;
                string cs = ConfigurationManager.ConnectionStrings["BDTCS"].ConnectionString;
                using (SqlConnection con = new SqlConnection(cs))
                {
                   
                    SqlCommand cmd = new SqlCommand(@"Select FOTO_USUARIO, UBIC_PUBLIC, PRECIO_PUBLIC, ID_PUBLIC from Usuario 
    				INNER JOIN  Publicacion on Publicacion.ID_USU = Usuario.ID_USU where PRECIO_PUBLIC 
    				between  @maximo and @minimo ORDER BY Usuario.ID_USU DESC", con);
                    cmd.Parameters.AddWithValue("@maximo",Int32.TryParse(TxtMaximo.Text, out numero1) ? Convert.ToInt32(TxtMaximo.Text):0);
                    cmd.Parameters.AddWithValue("@minimo",Int32.TryParse(TxtMinimo.Text, out numero2) ?Convert.ToInt32(TxtMinimo.Text):0);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
    
                    DataTable ImagenesPublic = new DataTable();
                    da.Fill(ImagenesPublic);
    
                    repeater1.DataSource = ImagenesPublic;
                    repeater1.DataBind();
                }
            }


    Votar es agradecer.
    Saludos.
    Lima-Perú


    domingo, 26 de agosto de 2018 1:46
  • de hecho el metodo lo llamo desde el page_load...
    no utilizo boton para eso ya que al llamarse a traves del page_load deberia cargarlo inmediatamente supongo.
    y antes de empezar a usar el slider, ya le coloque un valor por defecto

    protected void Page_Load(object sender, EventArgs e) {

    if (!IsPostBack) { if (Session["alive"] != null) { ObtenerPublicaciones(); } else { Response.Redirect("http://dropbox.com"); } } } private void ObtenerPublicaciones() { int numero1; int numero2; string cs = ConfigurationManager.ConnectionStrings["BDTCS"].ConnectionString; using (SqlConnection con = new SqlConnection(cs)) { SqlCommand cmd = new SqlCommand(@"Select FOTO_USUARIO, UBIC_PUBLIC, PRECIO_PUBLIC, ID_PUBLIC from Usuario INNER JOIN Publicacion on Publicacion.ID_USU = Usuario.ID_USU where PRECIO_PUBLIC between @maximo and @minimo ORDER BY Usuario.ID_USU DESC", con); cmd.Parameters.AddWithValue("@maximo", Int32.TryParse(TxtMaximo.Text, out numero1) ? Convert.ToInt32(TxtMaximo.Text) : 0); cmd.Parameters.AddWithValue("@minimo", Int32.TryParse(TxtMinimo.Text, out numero2) ? Convert.ToInt32(TxtMinimo.Text) : 0); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable ImagenesPublic = new DataTable(); da.Fill(ImagenesPublic); repeater1.DataSource = ImagenesPublic; repeater1.DataBind(); } }

    y por si acaso aqui esta la parte HTML 

    <div style="; top:10px; right:518px;">
                     Precio $: <span id="spanOutPut"></span>                 
                </div>
                <div id="slider" style="; top:13px; width:300px; right:190px"></div>
                <div style="; top:35px; right:0px;">
                    <label for="TxtMinimo">Precio Mínimo</label>
                    <asp:TextBox ID="TxtMinimo" Enabled="false" TextMode="Number" runat="server"></asp:TextBox>
                    <label for="TxtMaximo">Precio Máximo</label>
                    <asp:TextBox ID="TxtMaximo" Enabled="false" TextMode="Number" runat="server"></asp:TextBox>
                </div>

    y aqui el script

    <script type="text/javascript">
        $(document).ready(function () {
            var OutPutSpan = $('#spanOutPut');
            var sliderElement = $('#slider');
    
            sliderElement.slider({
                range: true,
                min: 0,
                max: 1000000,
                values : [100000, 250000],
                slide: function (event, ui) {
                    OutPutSpan.html(ui.values[0] + ' - ' + ui.values[1]);
                    $('#TxtMinimo').val(ui.values[0]);
                    $('#TxtMaximo').val(ui.values[1]);
                }            
            });
    
            OutPutSpan.html(sliderElement.slider('values', 0) + ' - ' + sliderElement.slider('values', 1));
            $('#TxtMinimo').val(sliderElement.slider('values', 0));
            $('#TxtMaximo').val(sliderElement.slider('values', 1));
        });
    </script>


    DiegoThonCortes

    domingo, 26 de agosto de 2018 2:03
  • La idea es esta:

    en la parte de arriba a la derecha, sobre el mapa, hay un slider de rangos, y al deslizarlo derecha o izquierda va escribiendo los rangos de precio en esos dos textbox deshabilitados... 

    la idea es que al ir deslizandose vayan filtrandose en el cuadro de negro al lado del mapa, los avisos entre el rango de precios que salen en los textbox.


    DiegoThonCortes

    domingo, 26 de agosto de 2018 1:19

Todas las respuestas

  • hola, parece que es por los espacios que falta

    cmd.CommandText = "Select FOTO_USUARIO, UBIC_PUBLIC, PRECIO_PUBLIC, ID_PUBLIC from Usuario

    INNER JOIN Publicacion on Publicacion.ID_USU = Usuario.ID_USU where PRECIO_PUBLIC

    between " + Convert.ToInt32(TxtMaximo.Text) + " and " + Convert.ToInt32(TxtMinimo.Text) + " ORDER BY Usuario.ID_USU DESC";

    por otro lado es recomendable que parametrices la consulta

     private void ObtenerPublicaciones()
            {
                string cs = ConfigurationManager.ConnectionStrings["BDTCS"].ConnectionString;
                using (SqlConnection con = new SqlConnection(cs))
                {
                    SqlCommand cmd = new SqlCommand(@"Select FOTO_USUARIO, UBIC_PUBLIC, PRECIO_PUBLIC, ID_PUBLIC from Usuario 
    				INNER JOIN  Publicacion on Publicacion.ID_USU = Usuario.ID_USU where PRECIO_PUBLIC 
    				between  @maximo and @minimo ORDER BY Usuario.ID_USU DESC",con );
    				cmd.Parameters.AddWithValue("@maximo",Convert.ToInt32(TxtMaximo.Text));
    				cmd.Parameters.AddWithValue("@minimo",Convert.ToInt32(TxtMinimo.Text));
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                  
                    DataTable ImagenesPublic = new DataTable();
    				da.Fill(ImagenesPublic);
                
                    repeater1.DataSource = ImagenesPublic;
                    repeater1.DataBind();
                }
            }
    		


    Votar es agradecer.
    Saludos.
    Lima-Perú




    • Editado Augusto1982 sábado, 25 de agosto de 2018 22:04
    sábado, 25 de agosto de 2018 21:54
  • Hola, gracias por la ayuda, pero me sigue tirando el mismo error de formato! :(


    DiegoThonCortes

    domingo, 26 de agosto de 2018 0:25
  • Hola, gracias por la ayuda, pero me sigue tirando el mismo error de formato! :(


    DiegoThonCortes

    hola que valor estas tratando de ingresar en el textbox porque al hacer convert.Toint32 se esta esperando que sea un valor entero , si estás tratando de ingresar otro tipo de valor castealo al tipo de dato adecuado , puede ser un Conver.ToDouble o Convert.ToString  .

    Clase Convert


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 domingo, 26 de agosto de 2018 1:12
    domingo, 26 de agosto de 2018 1:11
  • La idea es esta:

    en la parte de arriba a la derecha, sobre el mapa, hay un slider de rangos, y al deslizarlo derecha o izquierda va escribiendo los rangos de precio en esos dos textbox deshabilitados... 

    la idea es que al ir deslizandose vayan filtrandose en el cuadro de negro al lado del mapa, los avisos entre el rango de precios que salen en los textbox.


    DiegoThonCortes

    domingo, 26 de agosto de 2018 1:19
  • Ya veo, pero no defines en que momento llamas al método  

    ObtenerPublicaciones(), en que evento , en el click de un botón , al momento de deslizar los slider, porque pueda ser que este llegando un textbox en blanco por lo que te genera el error,deberías validarlo desde tu capa de presentación ,como lo vienes haciendo podrías hacer que te ponga un valor por defecto como 0 si esta vacío el textbox

     private void ObtenerPublicaciones()
            {
                int numero1;
                int numero2;
                string cs = ConfigurationManager.ConnectionStrings["BDTCS"].ConnectionString;
                using (SqlConnection con = new SqlConnection(cs))
                {
                   
                    SqlCommand cmd = new SqlCommand(@"Select FOTO_USUARIO, UBIC_PUBLIC, PRECIO_PUBLIC, ID_PUBLIC from Usuario 
    				INNER JOIN  Publicacion on Publicacion.ID_USU = Usuario.ID_USU where PRECIO_PUBLIC 
    				between  @maximo and @minimo ORDER BY Usuario.ID_USU DESC", con);
                    cmd.Parameters.AddWithValue("@maximo",Int32.TryParse(TxtMaximo.Text, out numero1) ? Convert.ToInt32(TxtMaximo.Text):0);
                    cmd.Parameters.AddWithValue("@minimo",Int32.TryParse(TxtMinimo.Text, out numero2) ?Convert.ToInt32(TxtMinimo.Text):0);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
    
                    DataTable ImagenesPublic = new DataTable();
                    da.Fill(ImagenesPublic);
    
                    repeater1.DataSource = ImagenesPublic;
                    repeater1.DataBind();
                }
            }


    Votar es agradecer.
    Saludos.
    Lima-Perú


    domingo, 26 de agosto de 2018 1:46
  • de hecho el metodo lo llamo desde el page_load...
    no utilizo boton para eso ya que al llamarse a traves del page_load deberia cargarlo inmediatamente supongo.
    y antes de empezar a usar el slider, ya le coloque un valor por defecto

    protected void Page_Load(object sender, EventArgs e) {

    if (!IsPostBack) { if (Session["alive"] != null) { ObtenerPublicaciones(); } else { Response.Redirect("http://dropbox.com"); } } } private void ObtenerPublicaciones() { int numero1; int numero2; string cs = ConfigurationManager.ConnectionStrings["BDTCS"].ConnectionString; using (SqlConnection con = new SqlConnection(cs)) { SqlCommand cmd = new SqlCommand(@"Select FOTO_USUARIO, UBIC_PUBLIC, PRECIO_PUBLIC, ID_PUBLIC from Usuario INNER JOIN Publicacion on Publicacion.ID_USU = Usuario.ID_USU where PRECIO_PUBLIC between @maximo and @minimo ORDER BY Usuario.ID_USU DESC", con); cmd.Parameters.AddWithValue("@maximo", Int32.TryParse(TxtMaximo.Text, out numero1) ? Convert.ToInt32(TxtMaximo.Text) : 0); cmd.Parameters.AddWithValue("@minimo", Int32.TryParse(TxtMinimo.Text, out numero2) ? Convert.ToInt32(TxtMinimo.Text) : 0); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable ImagenesPublic = new DataTable(); da.Fill(ImagenesPublic); repeater1.DataSource = ImagenesPublic; repeater1.DataBind(); } }

    y por si acaso aqui esta la parte HTML 

    <div style="; top:10px; right:518px;">
                     Precio $: <span id="spanOutPut"></span>                 
                </div>
                <div id="slider" style="; top:13px; width:300px; right:190px"></div>
                <div style="; top:35px; right:0px;">
                    <label for="TxtMinimo">Precio Mínimo</label>
                    <asp:TextBox ID="TxtMinimo" Enabled="false" TextMode="Number" runat="server"></asp:TextBox>
                    <label for="TxtMaximo">Precio Máximo</label>
                    <asp:TextBox ID="TxtMaximo" Enabled="false" TextMode="Number" runat="server"></asp:TextBox>
                </div>

    y aqui el script

    <script type="text/javascript">
        $(document).ready(function () {
            var OutPutSpan = $('#spanOutPut');
            var sliderElement = $('#slider');
    
            sliderElement.slider({
                range: true,
                min: 0,
                max: 1000000,
                values : [100000, 250000],
                slide: function (event, ui) {
                    OutPutSpan.html(ui.values[0] + ' - ' + ui.values[1]);
                    $('#TxtMinimo').val(ui.values[0]);
                    $('#TxtMaximo').val(ui.values[1]);
                }            
            });
    
            OutPutSpan.html(sliderElement.slider('values', 0) + ' - ' + sliderElement.slider('values', 1));
            $('#TxtMinimo').val(sliderElement.slider('values', 0));
            $('#TxtMaximo').val(sliderElement.slider('values', 1));
        });
    </script>


    DiegoThonCortes

    domingo, 26 de agosto de 2018 2:03
  • "....no utilizo boton para eso ya que al llamarse a traves del page_load deberia cargarlo inmediatamente supongo...."

    Si lo carga inmedatamente cuando se carga la página, por haberlo puesto entre este código

        if (!IsPostBack)
                {

    se cargará solo cuando ingreses la primera vez y cuando recargues la página desde el url y no cuando desencadenes eventos con controles de dentro de la página,para eso es esa validación.

    Ahora sigues obteniendo un error?.


    Votar es agradecer.
    Saludos.
    Lima-Perú

    domingo, 26 de agosto de 2018 2:21
  • jajaj siento que ya me quedo sin recursos, no me carga ni al inicio de pagina, por eso puse "supongo" porque es lo que deberia hacer, pero ni eso hace!

    tambien cree los eventos OnChange  de ambos textbox y puse el metodo ahi, pero aunque ahora no me arroja ningun error, no muestra nada!


    DiegoThonCortes

    domingo, 26 de agosto de 2018 2:26
  • "pero aunque ahora no me arroja ningun error, no muestra nada!

    no le pongas los cero que yo le puse ponle tus valores por defecto y  deberia mostrate algo,donde defines esos eventos OnChange , estas intentando llamar a un método de servidor como ObtenerPublicaciones desde el lado cliente usando jquery , entonces deberías hacer algo como esto

    Calling server side methods using JavaScript and JQuery in ASP.Net

    por otro lado para probar podrías usar el evento de servidor de los textbox que se lanza cuando se modifica el contenido

    Evento TextBox.TextChanged


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 domingo, 26 de agosto de 2018 2:47
    domingo, 26 de agosto de 2018 2:45