Foros del Web » Programando para Internet » ASP Clásico »

Parametrizar sentencias SQL

Estas en el tema de Parametrizar sentencias SQL en el foro de ASP Clásico en Foros del Web. Estoy parametrizando una consulta en un sitio web pero no se como utilizar parametros y comodines a la vez. Regularmente parametrizo asi: antes: cmd.CommandText="SELECT * ...
  #1 (permalink)  
Antiguo 21/02/2008, 23:28
 
Fecha de Ingreso: febrero-2008
Mensajes: 4
Antigüedad: 16 años, 3 meses
Puntos: 0
Parametrizar sentencias SQL

Estoy parametrizando una consulta en un sitio web pero no se como utilizar parametros y comodines a la vez. Regularmente parametrizo asi:

antes: cmd.CommandText="SELECT * FROM table WHERE id="&var

parametrizado:
cmd.CommandText="SELECT * FROM table WHERE id=?"
set param=cmd.CreateParameter(,16,1,le(var),var)
cmd.Parameters.Append param


Esta vez quiero parametrizar esto:
cmd.CommandText="SELECT * FROM table WHERE name LIKE '%" &var &"%'"

Pero no se como hacerlo. Espero me puedan ayudar, gracias
  #2 (permalink)  
Antiguo 22/02/2008, 08:34
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: Parametrizar sentencias SQL

Probaste lo siguiente?

cmd.CommandText="SELECT * FROM table WHERE name LIKE '%?%'"

por cierto, ¿qu BD esas?, ¿no te es más sencillo usar procedimientos almacenados?

Saludos
  #3 (permalink)  
Antiguo 22/02/2008, 11:49
Avatar de Epunamun  
Fecha de Ingreso: noviembre-2004
Mensajes: 133
Antigüedad: 19 años, 6 meses
Puntos: 0
Re: Parametrizar sentencias SQL

pero el sp no sirve de nada si los datos no estan parametrizados... o lo haces en el sp o en el cod ASP.
  #4 (permalink)  
Antiguo 22/02/2008, 12:30
 
Fecha de Ingreso: febrero-2008
Mensajes: 4
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Parametrizar sentencias SQL

Estoy utilizando SQLServer. No tengo permisos para utilizar procedimientos almacenados. solo debo usar parametrización, ya intente varias formas para realizar mis consultas, peor no obtengo ningun resultado. Esto es lo que e intentado:

cmd.CommandText="SELECT * FROM table WHERE id LIKE %?%"
set param=cmd.CreateParameter(,16,1,le(var),var)
cmd.Parameters.Append param

cmd.CommandText="SELECT * FROM table WHERE id LIKE '%?%'"
set param=cmd.CreateParameter(,16,1,le(var),var)
cmd.Parameters.Append param

cmd.CommandText="SELECT * FROM table WHERE id LIKE ?"
set param=cmd.CreateParameter(,16,1,le("'%"&var&"%'"), "'%"&var&"%'")
cmd.Parameters.Append param

cmd.CommandText="SELECT * FROM table WHERE id LIKE ?"
set param=cmd.CreateParameter(,16,1,le("%"&var&"%"),"% "&var&"%")
cmd.Parameters.Append param


y no e podido obtener los mismos resultados que usando la concatenación de cadenas
  #5 (permalink)  
Antiguo 22/02/2008, 13:11
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: Parametrizar sentencias SQL

Cita:
Iniciado por Epunamun Ver Mensaje
pero el sp no sirve de nada si los datos no estan parametrizados
No entiendo que es lo que quisiste decir.

El SP tiene los parámetros y no ocupas definirlos en el comandText. Esto significa que no es el provider de la conexión quien haga el filtro sino directamente la BD's, ahora quizá esto no repercuta en un mejor desempeño a simple vista, pero independientemente de ello, siempre he compartido la idea de que la capa de datos debe manejarse lo más posible en el servidor de BD's, por ello sobre el uso de los SP.

Cita:
Iniciado por Epunamun Ver Mensaje
o lo haces en el sp o en el cod ASP.
Esto tampoco lo entiendo.

Por un lado, si defines SP con parámetros es obio que desde ASP debes mandarle los valores a dichos parámetros entonces para una misma tarea programas en la BD y en ASP; y por otro si leo lo que escribiste de forma literal, suena a perogrullada ... ... ... pues no, tampoco entiendo que quisiste decir con este argumento.


Cita:
Iniciado por antbrosio
y no e podido obtener los mismos resultados que usando la concatenación de cadenas
A ver, deja hago una prueba, como te habrás dado cuenta yo no parámetrizo mediente el CommandText, sino desde los SP, dame unos minutos.

Última edición por Myakire; 22/02/2008 a las 13:30
  #6 (permalink)  
Antiguo 22/02/2008, 13:27
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: Parametrizar sentencias SQL

Tienes razón antbrosio, la forma para que regrese los mismos datos es esta:

Código:
<!--#include virtual="/SicoiWeb/Conexion.asp"-->
<!-- #INCLUDE virtual="/SicoiWeb/adovbs.inc" -->
<%
Set cmd=server.CreateObject("ADODB.command")
Set cmd.ActiveConnection = Con

'   cmd.CommandText = "select * from clientes where codigocliente like '%pemsa%'"
   cmd.CommandText = "select * from clientes where codigocliente like ?"

   cmd.CommandType=adCmdText
   cmd.Parameters.Append cmd.CreateParameter(,adVarchar, adParamInput, 13, "%PEMSA%")
   cmd.Prepared = True
	 
set rs = Server.CreateObject("adodb.recordset")
	 
set rs = cmd.Execute
%>
<table border=1>
<%

while not rs.eof
  %><tr><%
	for i=0 to rs.fields.count-1
  %><td><%=rs(i)%><%
	next
  rs.movenext 
wend
%>
</table>
saludos!!
  #7 (permalink)  
Antiguo 23/02/2008, 22:55
 
Fecha de Ingreso: febrero-2008
Mensajes: 4
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Parametrizar sentencias SQL

mmm eso ya lo habia intentado antes y no me funcionó pero volvere a intentarlo, gracias.

a ti si te regreso los mismos resutados ke usano la concatenacion de cadenas????
  #8 (permalink)  
Antiguo 25/02/2008, 08:13
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: Parametrizar sentencias SQL

Ese código que te puse funciona perfectamente
  #9 (permalink)  
Antiguo 25/02/2008, 16:19
 
Fecha de Ingreso: febrero-2008
Mensajes: 4
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Parametrizar sentencias SQL

muchas gracias Myakire ya me funciona correctamente, sol ke me kedo con la duda de porke antes no me abia funcionado si ya habia intentado lo mismo, pero no importa, el hecho es que yan esta

Gracias
  #10 (permalink)  
Antiguo 27/02/2008, 06:23
 
Fecha de Ingreso: septiembre-2005
Mensajes: 135
Antigüedad: 18 años, 8 meses
Puntos: 1
Re: Parametrizar sentencias SQL

Una pregunta a todo esto Myakire sobre todo,

que diferencia hay de usar el commantext a utilizar una cadena de texto en un Recordset??

me explico

1.

strsql = "SELECT * FROM EMPLEADOS WHERE EMP_INT_IDEMPLEADO = " & Empleado
Rec.Open strsql,conn

2.

cmd.CommandText = "select * from clientes where codigocliente like ?"

cmd.CommandType=adCmdText
cmd.Parameters.Append cmd.CreateParameter(,adVarchar, adParamInput, 13, "%PEMSA%")
cmd.Prepared = True

set rs = Server.CreateObject("adodb.recordset")

set rs = cmd.Execute


Tengo entendido que con la segunda forma (la que proponeis aqui) te quitas de problemas con SQL Injection pero no estoy seguro de si es asi.

Un saludo.
  #11 (permalink)  
Antiguo 27/02/2008, 08:32
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: Parametrizar sentencias SQL

Bueno, si, efectivamente una ventaja de parametrizar consultas es evitar el SQL Injection, ya que controlas el tipo, contenido, tamaño y nombre inclusive de los parámetros, pero no es la única.

Quizá la diferencia más evidente es que el recordSet es solo para almacenar un cursor de datos que la DB te regrese, el command es para cualquier sentencia del lenguaje de manipulación de datos (LMD); otra es que aunque tanto con el RecordSet como con el Command puedes ejecutar procedimientos almacenados, solo mediante definición de parámetros del command puedes atrapar los valores de retorno de estos.

Dale una mirada a este artículo: http://www.aspfaq.com/params.htm

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:27.