Consultas parametrizadas

Creado por Pablo Céspedes, Modificado el Lun, 3 Mar a 5:42 P. M. por Pablo Céspedes

A partir del hotfix 68 de la versión 5.0.0 se ha implementado un sistema de consultas parametrizadas para las llamadas a la base de datos desde el ERP, optimizando enormemente las consultas puesto que SQL Server puede reaprovechar los planes de ejecución sin llenar la caché de planes ni tener que recompilar en cada ocasión la consulta.


Aunque el sistema anterior está marcado como obsoleto y se puede seguir usando, aconsejamos el uso del nuevo sistema, en el cual se envía por una parte la consulta con unos marcaradores para los parámetros y por otra parte los valores en sí de los mismos. 


Parámetros:


-Deben empezar por "@p0" e ir incrementando según el número de parámetro a sustituir ("@p1", "@p2", etc.).


- No es necesario añadir carácteres especiales para las cadenas (" ' ") ni formatear valores de fecha o de números, únicamente asegurarse que los valores contenidos en la variable de tipo Valor que se le pasa tiene a nivel interno el tipo correctamente establecido.


- Cuando no sea necesario pasar ningún parámetro, simplemente pasaremos un array vacío, de esta forma: Array.Empty<Valor>().


Ejemplos Conexión

// Antes:
valor = gCn.DameValorCampo("SELECT IdDoc FROM Clientes_Datos WHERE IdCliente='00001'") ;
// Ahora:
valor = gCn.DameValorCampo("SELECT IdDoc FROM Clientes_Datos WHERE IdCliente=@p0", new Valor[] { "00001" });

// Antes:
gCn.ExecuteSql("DELETE Clientes_Datos WHERE IdDoc=1")  ;
// Ahora:
gCn.ExecuteSql("DELETE Clientes_Datos WHERE IdDoc=@p0", new Valor[] { 1 });

// Antes:
rs = gCn.OpenResultSet("SELECT * FROM Clientes_Datos WHERE Padre = '00001'");
// Ahora:
rs = gCn.OpenResultSet("SELECT * FROM Clientes_Datos WHERE Padre = @p0", new Valor[] { "00001" });

// Antes:
lAux = gCn.BuscarPropiedad("Sep", "Select dbo.funSeparacionFechasComercial( { d '" + Format(EObjeto.ObjGlobal["FechaFact"], "YYYY-MM-DD") + "' } , { d '" + Format(grdRetenciones.GetValue("Fecha"), "YYYY-MM-DD") + "' }, 0) As Sep");
// Ahora:
lAux = gCn.BuscarPropiedad("Sep", "Select dbo.funSeparacionFechasComercial(@p0,@p1,0) As Sep", new Valor[] { EObjeto.ObjGlobal["FechaFact"], grdRetenciones.GetValue("Fecha") });


Ejemplos Objetos

// Antes:
col = gCn.Obj.DameColeccion("Clientes","WHERE Padre=" + SqlString(IdCliente.Text));
// Después:
col = gCn.Obj.DameColeccion("Clientes","WHERE Padre=@p0", new Valor[] { IdCliente.Text });

// Antes:
item = gCn.Obj.DameObjeto("Clientes","WHERE Padre=" + SqlString(EObjeto.ObjGlobal["IdCliente"]));
// Después:
item = gCn.Obj.DameObjeto("Clientes","WHERE Padre=@p0", new Valor[] {EObjeto.ObjGlobal["IdCliente"]});

// Antes:
col.SQL = "SELECT * FROM Clientes_Datos WHERE Padre = '00001'";
// Después:
col.SQLParametrizada = "SELECT * FROM Clientes_Datos WHERE Padre = @p0";
col.SqlParams = new Valor[] {"00001"};


Ejemplos Controles

// Antes:
grdPropiedades.Where = "WHERE IdPedido=" + VGetNumber(grdLineas.GetValue("IdPedido")) + " AND IdLinea = " + VGetNumber(grdLineas.GetValue("IdLinea"));
// Después:
grdPropiedades.SetWhereParams("WHERE IdPedido=@p0 AND IdLinea=@p1", new Valor[] { grdLineas.GetValue("IdPedido"), grdLineas.GetValue("IdLinea") });

// Antes:
IdContactoF.Descripcion = "SELECT IdContacto, Nombre, Nif FROM Clientes_Contactos WHERE IdCliente = " + SqlString(lPadre) + " AND IdTipo=0 ORDER BY IdContacto";
// Después:
IdContactoF.SetDescripcionParams("SELECT IdContacto, Nombre, Nif FROM Clientes_Contactos WHERE IdCliente = @p0 AND IdTipo=0 ORDER BY IdContacto", new Valor[] { lPadre });

// Antes:
idCliente.Descripcion = cSql_IdCliente;
// Después:
IdCliente.SetDescripcionParams(cSql_IdCliente, Array.Empty<Valor>());

¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo