SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: Johnny Brusko en Viernes 15 de Agosto de 2008, 18:04

Título: Problemas con parámetros
Publicado por: Johnny Brusko en Viernes 15 de Agosto de 2008, 18:04
Tengo un metodo en C# que me devuelve en un DataTable una serie de noticias dependiendo de varios parametros que le paso. El problema es que si utilizo parametros para construir la sentencia sql, me devuelve el DataTable vacio, pero si lo hago con los datos directamente en la sentencia no tengo ningún problema.

Código: Text
  1.  
  2.     //metodo que nos devuelve una tabla con las noticias paginadas
  3.     public DataTable obtenerNoticiasPaginadas(Int32 numeroPagina, String palabra, DateTime fechaInicio, DateTime fechaFin)
  4.     {
  5.         try
  6.         {
  7.             String strSql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY fecha DESC) AS RowNumber FROM noticias WHERE (titular LIKE '%@palabra%' OR cuerpo LIKE '%@palabra%') AND fecha BETWEEN @fechaInicio AND @fechaFin) AS noticias WHERE RowNumber BETWEEN (@tamanoPagina * @numeroPagina + 1 - @tamanoPagina) AND (@tamanoPagina * (@numeroPagina + 1) - @tamanoPagina)";
  8.  
  9.             SqlCommand comando = new SqlCommand(strSql, conexion);
  10.             comando.Parameters.AddWithValue("@tamanoPagina", Int32.Parse(ConfigurationManager.AppSettings["paginadoNoticias"]));
  11.             comando.Parameters.AddWithValue("@numeroPagina", numeroPagina);
  12.             comando.Parameters.AddWithValue("@palabra", palabra);
  13.             comando.Parameters.AddWithValue("@fechaInicio", fechaInicio);
  14.             comando.Parameters.AddWithValue("@fechaFin", fechaFin);
  15.             SqlDataAdapter adaptador = new SqlDataAdapter(comando);
  16.  
  17.             DataTable tablaNoticias = new DataTable("Noticias");
  18.  
  19.             conexion.Open();
  20.             adaptador.Fill(tablaNoticias);
  21.             conexion.Close();
  22.  
  23.             return tablaNoticias;
  24.         }
  25.         catch (Exception exc)
  26.         {
  27.             conexion.Close();
  28.             throw exc;
  29.         }
  30.     }
  31.  
  32.  

Si sustituyo en la sentencia sql
Código: Text
  1. LIKE '%@palabra%' OR cuerpo LIKE '%@palabra%'
  2.  
por
Código: Text
  1. LIKE '%ipsum%' OR cuerpo LIKE '%ipsum%'
  2.  
siendo ipsum un texto que hay en la base de datos, el metodo funciona perfectamente.

¿Alguien puede ayudarme a encontrar la luz al final del tunel? ¿Por qué no me funciona con el parametro @palabra?
Título: Re: Problemas con parámetros
Publicado por: Johnny Brusko en Lunes 18 de Agosto de 2008, 19:48
Después de investigar y hacer muchas pruebas he conseguido saber qué fallaba en mi código. Por si a alguien le es de interés lo dejo por aquí.

Código: Text
  1. SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY fecha DESC) AS RowNumber FROM noticias WHERE (titular LIKE '%'+@palabra+'%' OR cuerpo LIKE '%'+@palabra+'%') AND fecha BETWEEN @fechaInicio AND @fechaFin) AS noticias WHERE RowNumber BETWEEN (@tamanoPagina * @numeroPagina + 1 - @tamanoPagina) AND (@tamanoPagina * (@numeroPagina + 1) - @tamanoPagina)
  2.  

Mi sentencia sql ha quedado finalmente así. El parametro @palabra al ser un string no necesitaba de las comillas pero los porcentajes para hacer una busqueda más abierta si que las necesitaban.

Un saludo.