none
Error: "No se puede realizar la operación 'Like' en System.Int32 y System.String." RRS feed

  • Pregunta

  • Hola estoy filtrando un DataTable y uno de los criterios de filtrado es un numero, aunque es pasado como un string (Por ej "3") me da este error al ejecutar:

    "No se puede realizar la operación 'Like' en System.Int32 y System.String."

    El codigo donde sale el error es este

    dr = unDataTable.Select(nomColumna1 + " LIKE '%" + cadenaTextBox1 + "%' AND " + nomColumna2 + " LIKE '%" + cadenaTextBox2 + "%' AND " + nomColumna3 + " LIKE '%" + cadenaTextBox3 + "%'");
    

    nomColumna son los nombres de las columnas

    cadenaTextBox son los criterios por los que se busca

    El problema esta en que una de las columnas contiene datos de tipo entero, mas alla de que yo le paso un string (Por ej: "3").

    Alguien sabe como puedo solucionar esto?

     

    jueves, 8 de septiembre de 2011 1:18

Respuestas

  • Hola Leandro,Civil Developer,xGs_Manco 

    Estáis enfocando la posible solución a la BB.DD y es más sencillo de hecho @fran_tatenge ya ha aportado la solución con esta frase.

    yo busque por todos lados y veo que se puede usar una funcion CONVERT(string1, 'System.String') pero no se donde ni como la usaria en ese caso.

    La exception que está recibiendo es del tipo EvaluateException, esta realizando una operación Select con  like sobre una columna del DataTable que es de tipo System.Int32.

     

    Voy a pasar un fragmento de código para que se vea cual es la solución y que linea comentada provoca el error.

     DataTable t = new DataTable();
                t.Columns.Add("id", typeof(System.Int32));
                t.Rows.Add(new object[] { 1 });
                t.Rows.Add(new object[] { 2 });
                t.Rows.Add(new object[] { 3 });
    
                string ValorFiltro = "3";
    
                //Error EvaluateException No se puede realizar la operación 'Like' en System.Int32 y System.String.
    
                //string Sql = string.Format("id like '%{0}%'", ValorFiltro); 
    
                string Sql = string.Format("Convert(id,'System.String') like '%{0}%'", ValorFiltro); 
    
                DataRow[] Rows = t.Select(Sql);
    


    Otra solución utilizando linq, para ello tienes que tener Framework 3.5 y referenciar System.Data.DataSetExtensions.

     var rows = from row in t.AsEnumerable()
                        where row.Field<Int32>("id").ToString().Contains(ValorFiltro)
                        select row;
    


    Paso dos link uno que dice lo mismo que yo comento y el otro a DataColumn.Expresion

    1. http://blogs.msdn.com/b/spike/archive/2009/05/11/how-use-convert-in-a-datatable-select.aspx

    2. http://msdn.microsoft.com/es-es/library/system.data.datacolumn.expression(v=vs.80).aspx (ver CONVERT).

    Saludos,


    phurtado
    • Marcado como respuesta fran_tatengue sábado, 10 de septiembre de 2011 12:19
    jueves, 8 de septiembre de 2011 8:28
    Moderador

Todas las respuestas

  • de casualidad los cadenaTextBox1  no son los controles Textbox, no ? porque si lo fuieran falta la propiedad .Text

    o sea cadenaTextBox1.Text

     

    salidos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 8 de septiembre de 2011 1:26
  • Gracias por la pregunta pero no, son strings.

    yo busque por todos lados y veo que se puede usar una funcion CONVERT(string1, 'System.String') pero no se donde ni como la usaria en ese caso

    jueves, 8 de septiembre de 2011 1:33
  • Que tal...

    Hasta donde yo sé y cosa que no lo sé :( no sé si sea posible hacer lo que tu haces, es decir...

    select usuario from usuario where usuario like '%Nombre%'
    and usuario like '%Tester%'

    Esto no produciría ningún resultado dado que en el "cruce" del select no hay un usuario Nombre y que tenga Tester

    Esto sí produciría algo:

    select usuario from usuario where usuario like '%Root%'
    and usuario like '%Do%'

    USUARIO                                           
    --------------------------------------------------
    Root Do

    Porque ni nombre de usuario es Root Do en la tabla. Pero la primera select no devuelve nada.

    Concatenar varios like no creo que funcionen en este caso. Pero será cosa de probar. Yo al menos lo hice y no me funcionó.

    Otra cosa...como convertir...:

    Convert.ToString(var);

    Es decir...

    Convert.ToString(cadenaTextBox1);

    Pero ojo con lo que dice Leandro. cadenaTextBox1 no son controles textbox ? Porque en todo caso solo habría que agregar cadenaTextBox1.Text y con esto tienes no ocupas covertir a nada.


    Compartir es aprender To share is to learn 0 1 2 3 4 5 6 7 8 9 0 Nayarit; México
    • Editado Crack it jueves, 8 de septiembre de 2011 1:50 text added
    jueves, 8 de septiembre de 2011 1:47
  • bien, los campos que usas en las variables nomColumna1, etc, sabes si alguno esta definido como INT en la tabla ?

    si slguno es int quizas a este debas castearlo a string usando

    CAST(campo As varchar(10)) LIKE '%valorbuscar%'

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 8 de septiembre de 2011 2:38
  • Ese error te sale si en la base de datos el campo de alguna de las columnas está como int, lo que tienes que hacer es convertir la columna en varchar.

    Conviertiendo todas las columnas quedaría algo como esto

     

    dr = unDataTable.Select(CONVERT(VARCHAR(10),nomColumna1) + " LIKE '%" + cadenaTextBox1 + "%' AND " + CONVERT(VARCHAR(10),nomColumna2) + " LIKE '%" + cadenaTextBox2 + "%' AND " + CONVERT(VARCHAR(10),nomColumna3) + " LIKE '%" + cadenaTextBox3 + "%'"
    


     


    La tecnologia te envuelve
    • Editado xGs_Manco jueves, 8 de septiembre de 2011 3:03
    jueves, 8 de septiembre de 2011 3:02
  • Hola Leandro,Civil Developer,xGs_Manco 

    Estáis enfocando la posible solución a la BB.DD y es más sencillo de hecho @fran_tatenge ya ha aportado la solución con esta frase.

    yo busque por todos lados y veo que se puede usar una funcion CONVERT(string1, 'System.String') pero no se donde ni como la usaria en ese caso.

    La exception que está recibiendo es del tipo EvaluateException, esta realizando una operación Select con  like sobre una columna del DataTable que es de tipo System.Int32.

     

    Voy a pasar un fragmento de código para que se vea cual es la solución y que linea comentada provoca el error.

     DataTable t = new DataTable();
                t.Columns.Add("id", typeof(System.Int32));
                t.Rows.Add(new object[] { 1 });
                t.Rows.Add(new object[] { 2 });
                t.Rows.Add(new object[] { 3 });
    
                string ValorFiltro = "3";
    
                //Error EvaluateException No se puede realizar la operación 'Like' en System.Int32 y System.String.
    
                //string Sql = string.Format("id like '%{0}%'", ValorFiltro); 
    
                string Sql = string.Format("Convert(id,'System.String') like '%{0}%'", ValorFiltro); 
    
                DataRow[] Rows = t.Select(Sql);
    


    Otra solución utilizando linq, para ello tienes que tener Framework 3.5 y referenciar System.Data.DataSetExtensions.

     var rows = from row in t.AsEnumerable()
                        where row.Field<Int32>("id").ToString().Contains(ValorFiltro)
                        select row;
    


    Paso dos link uno que dice lo mismo que yo comento y el otro a DataColumn.Expresion

    1. http://blogs.msdn.com/b/spike/archive/2009/05/11/how-use-convert-in-a-datatable-select.aspx

    2. http://msdn.microsoft.com/es-es/library/system.data.datacolumn.expression(v=vs.80).aspx (ver CONVERT).

    Saludos,


    phurtado
    • Marcado como respuesta fran_tatengue sábado, 10 de septiembre de 2011 12:19
    jueves, 8 de septiembre de 2011 8:28
    Moderador
  • Esto es lo que me sirvio como respuesta:

      string Sql = string.Format("Convert(id,'System.String') like '%{0}%'", ValorFiltro); 

    Mas que nada use dentro de mi "consulta" esa forma de convertir, aca les dejo como quedó:

    dr = unDataTable.Select(nomColumna1 + " LIKE '%" + cadenaTextBox1 + "%' AND " + nomColumna2 + " LIKE '%" + cadenaTextBox2 + "%' AND Convert(" + nomColumna3 + ",'System.String') LIKE '%" + cadenaTextBox3 + "%'");
    

    Muchisimas Gracias, estaba muy trabado

    Saludos desde Paraná, Entre Ríos, Argentina.

    Fran.

    sábado, 10 de septiembre de 2011 12:23
  • Hola @fran_tatenge,

    Veo que al final has resuelto tu problema, pero la solución que has aportado no me gusta y te digo porque. El motivo es la forma en la que montas la cadena y ademas voy a ser un poco drástico en mi respuesta, jamas utilices '+' para concatenar cadenas.

    1. Eso no es eficiente, mira los siguiente ejemplo y ejecuta los dos.

     

    No Eficiente.

     string Resultado = string.Empty;
                for (int i=0;i<100000;i++)
                {
                    Resultado = Resultado + i.ToString();
                }
    


    Eficiente.

    StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 100000; i++)
                {
                    sb.Append(i);
                }
                string Resultado = sb.ToString();
    


    Así es como deberías de dejar tu código

     string nomColumna1 = "id";
               string nomColumna2 = "Nombre";
               string nomColumna3 = "Direccion";
    
               string cadenaTextBox1 = "3";
               string cadenaTextBox2 = "Mi Nombre";
                string cadenaTextBox3 = "Mi Direccion";
    
               
    
                String Sql  = "{0} LIKE '%{1}%' AND {2} LIKE '%{3}% AND Convert({4},'System.String') LIKE '%{5}%'";
                Sql = string.Format(Sql,nomColumna1,cadenaTextBox1,nomColumna2,cadenaTextBox2,nomColumna3,cadenaTextBox3);
    
    


    Saludos,

     

     

     

     


    phurtado
    sábado, 10 de septiembre de 2011 21:13
    Moderador
  • Pedro

    creo que en la parte

    LIKE '%{3}%

    has olvidado una comilla simples para cerrar el ultimo comodin del like


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 10 de septiembre de 2011 21:21
  • Tienes razon, perdón

     

                String Sql  = "{0} LIKE '%{1}%' AND {2} LIKE '%{3}%' AND Convert({4},'System.String') LIKE '%{5}%'";
                Sql = string.Format(Sql,nomColumna1,cadenaTextBox1,nomColumna2,cadenaTextBox2,nomColumna3,cadenaTextBox3);
    

    Saludos,


    phurtado
    sábado, 10 de septiembre de 2011 21:42
    Moderador