Pasar parametro a un dataset

19/08/2008 - 22:56 por Rick | Informe spam
Que tal foro, una duda, tengo una consulta sql la cual involucra la clausula
IN de SQL, el problema es que tengo que pasarle varias palabras para que
estén dentro de ese IN, normalmente la sql seria por ejemplo

select * from tabla where llave in ('A','B','C')

osea que quiero las filas cuyo campo llave sea A, B o C

ya tengo mi dataset hecho y le puse parametros para pasar esto

select * from tabla where llave in (@parametros)

el chiste es que pueden ser de 1 a N palabras las cuales pueden ir en el IN

pero al ejecutar mi aplicacion no me regresa datos, ya estube depurando y me
doy cuenta de que no me respeta el valor de @parametros

ejemplo de lo que hago;

String valores="";

MiDataset ds = new MiDataset;

MiDatasetTableAdapters.tablaTableAdapter miTA = new
MiDatasetTableAdapters.tablaTableAdapter;

valores="'A','B','C'";

miTA.Fill(ds.tabla, valores);



tambien intenté con

valores="A,B,C"; y nada =(

no toma los valores 1x1 para ser incluidos en la consulta, no se que tome,
pero si le pongo un solo valor si funciona =(

mi problema es como hacerle para mandar los N restantes =( alguna idea?



Saludos!!!

Preguntas similare

Leer las respuestas

#1 Juan Diego Bueno
20/08/2008 - 08:42 | Informe spam
Hola Rick:

Rick ha formulado la pregunta :
Que tal foro, una duda, tengo una consulta sql la cual involucra la clausula
IN de SQL, el problema es que tengo que pasarle varias palabras para que
estén dentro de ese IN, normalmente la sql seria por ejemplo

select * from tabla where llave in ('A','B','C')

osea que quiero las filas cuyo campo llave sea A, B o C

ya tengo mi dataset hecho y le puse parametros para pasar esto

select * from tabla where llave in (@parametros)

el chiste es que pueden ser de 1 a N palabras las cuales pueden ir en el IN

pero al ejecutar mi aplicacion no me regresa datos, ya estube depurando y me
doy cuenta de que no me respeta el valor de @parametros

ejemplo de lo que hago;

String valores="";

MiDataset ds = new MiDataset;

MiDatasetTableAdapters.tablaTableAdapter miTA = new
MiDatasetTableAdapters.tablaTableAdapter;

valores="'A','B','C'";

miTA.Fill(ds.tabla, valores);



tambien intenté con

valores="A,B,C"; y nada =(

no toma los valores 1x1 para ser incluidos en la consulta, no se que tome,
pero si le pongo un solo valor si funciona =(

mi problema es como hacerle para mandar los N restantes =( alguna idea?



Eso me pasó a mi hace tiempo y es por la propia naturaleza de los
parámetros. No vas a poder hacer un @parametro='a','b','c'. Esto tiene
bastante que ver con impedir la inyección de sql.

Tendrías que currarte un método que te cree dinámicamente parámetros de
forma que al final tengas un in (@p1,@p2,@p3...), y a la par has de
cambiar la query de forma dinámica.

Saludos

http://www.moondance.es
Respuesta Responder a este mensaje
#2 Alberto Poblacion
20/08/2008 - 08:53 | Informe spam
"Rick" wrote in message
news:
Que tal foro, una duda, tengo una consulta sql la cual involucra la
clausula IN de SQL, el problema es que tengo que pasarle varias palabras
para que estén dentro de ese IN, normalmente la sql seria por ejemplo

select * from tabla where llave in ('A','B','C')

osea que quiero las filas cuyo campo llave sea A, B o C

ya tengo mi dataset hecho y le puse parametros para pasar esto

select * from tabla where llave in (@parametros)

el chiste es que pueden ser de 1 a N palabras las cuales pueden ir en el
IN

pero al ejecutar mi aplicacion no me regresa datos, ya estube depurando y
me doy cuenta de que no me respeta el valor de @parametros




Me temo que te has topado con una limitación del sistema de
parametrización de sentencias. No es lícito pasar el contenido del "IN" como
parámetro, a no ser que haya un único valor, pero no vale un string separado
por comas.
No hay ninguna solución sencilla y elegante.
Si prescindimos de la elegancia, se puede hacer alguna chapuza tal como
concatenar el string a la sentencia en lugar de pasarlo como parámetro
(después de haberlo saneado para evitar ataques de inyección de SQL).
Si prescindimos de la sencillez, hay soluciones tales como pasar los
valores del IN en un XML y usar las instrucciones de manejo de XML en Sql
Server para filtrar por esos valores, o bien pasarlos en una tabla temporal
y hacer un JOIN en lugar del IN.
Respuesta Responder a este mensaje
#3 sergiotarrillo
20/08/2008 - 20:03 | Informe spam
Yo hice una funciona para esto algo así:

select * from tabla
where ldbo.CheckValores(@params, CAST( llave as Varchar)) = 1

Y bueno en la funciona sacaba los valores de paramas, y lo comparaba con
llave.

saludos,

SergioTarrillo - http://sergiot2.com/blog


"Alberto Poblacion" wrote:

"Rick" wrote in message
news:
> Que tal foro, una duda, tengo una consulta sql la cual involucra la
> clausula IN de SQL, el problema es que tengo que pasarle varias palabras
> para que estén dentro de ese IN, normalmente la sql seria por ejemplo
>
> select * from tabla where llave in ('A','B','C')
>
> osea que quiero las filas cuyo campo llave sea A, B o C
>
> ya tengo mi dataset hecho y le puse parametros para pasar esto
>
> select * from tabla where llave in (@parametros)
>
> el chiste es que pueden ser de 1 a N palabras las cuales pueden ir en el
> IN
>
> pero al ejecutar mi aplicacion no me regresa datos, ya estube depurando y
> me doy cuenta de que no me respeta el valor de @parametros


Me temo que te has topado con una limitación del sistema de
parametrización de sentencias. No es lícito pasar el contenido del "IN" como
parámetro, a no ser que haya un único valor, pero no vale un string separado
por comas.
No hay ninguna solución sencilla y elegante.
Si prescindimos de la elegancia, se puede hacer alguna chapuza tal como
concatenar el string a la sentencia en lugar de pasarlo como parámetro
(después de haberlo saneado para evitar ataques de inyección de SQL).
Si prescindimos de la sencillez, hay soluciones tales como pasar los
valores del IN en un XML y usar las instrucciones de manejo de XML en Sql
Server para filtrar por esos valores, o bien pasarlos en una tabla temporal
y hacer un JOIN en lugar del IN.


Respuesta Responder a este mensaje
#4 Rick
20/08/2008 - 22:48 | Informe spam
Muchas gracias a todos por sus respuestas, lo que terminé haciendo para no
quebrarmela tanto y sacarlo rapidin fue esto:

OdbcConnection Cnn = new OdbcConnection("Dsn=miDns;uid=sa;pwd3");

Cnn.Open();

String variable_con_los_datos;
MiDataset ds = new MiDataset();

variable_con_los_datos="'A','B','C'";

lsSql = "SELECT * from tabla where llave in ("+ variable_con_los_valores
+")";

OdbcDataAdapter da = new OdbcDataAdapter(lsSql, Cnn);

da.Fill(ds, "tabla");

ReportViewer1.ProcessingMode = ProcessingMode.Local;

ReportViewer1.LocalReport.ReportPath = "mi_reporte.rdlc";

ReportViewer1.SizeToReportContent = true;

ReportDataSource dataSource = new ReportDataSource("MiDataset_tabla",
ds.tabla);

ReportViewer1.LocalReport.DataSources.Add(dataSource);

ReportViewer1.LocalReport.Refresh();

Cnn.Close();

y ya con eso hagan de cuenta que la consulta es la mismita que creé en el
dataset, solo que en lugar de llamar al fill pues lo hago de esta otra
manera y ya con eso pues los parametros quedan a nivel de código y no
importa lo que sea.


Saludos!!!

"Rick" escribió en el mensaje
news:
Que tal foro, una duda, tengo una consulta sql la cual involucra la
clausula IN de SQL, el problema es que tengo que pasarle varias palabras
para que estén dentro de ese IN, normalmente la sql seria por ejemplo

select * from tabla where llave in ('A','B','C')

osea que quiero las filas cuyo campo llave sea A, B o C

ya tengo mi dataset hecho y le puse parametros para pasar esto

select * from tabla where llave in (@parametros)

el chiste es que pueden ser de 1 a N palabras las cuales pueden ir en el
IN

pero al ejecutar mi aplicacion no me regresa datos, ya estube depurando y
me doy cuenta de que no me respeta el valor de @parametros

ejemplo de lo que hago;

String valores="";

MiDataset ds = new MiDataset;

MiDatasetTableAdapters.tablaTableAdapter miTA = new
MiDatasetTableAdapters.tablaTableAdapter;

valores="'A','B','C'";

miTA.Fill(ds.tabla, valores);



tambien intenté con

valores="A,B,C"; y nada =(

no toma los valores 1x1 para ser incluidos en la consulta, no se que tome,
pero si le pongo un solo valor si funciona =(

mi problema es como hacerle para mandar los N restantes =( alguna idea?



Saludos!!!




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida