[Lazarus-es] Firebird zeos INSERT INTO no funciona

José Mejuto joshyfun en gmail.com
Mar Oct 9 10:24:39 CEST 2012


El 09/10/2012 8:12, Jose Antonio. Cuello Principal escribió:
> ¿Dónde pone que sea más correcto o más adecuado? ... Lo que se ejecuta
> al final es el contenido de SQL.TEXT por lo que si ya se lo das que
> problema hay.

Hola,

Hmmm, no, lo que se ejecuta es TEXT si, pero de modo diferente. 
Básicamente lo que sucede en el motor de base de datos (si los 
componentes funcionan bien claro) es algo como esto cuando insertamos 
tres registros:

Sin parámetros:

1.Creamos SQL
1.Preparamos SQL (BD)
1.Ejecutamos SQL (BD)
1."UnPrepare" SQL (BD)
2.Creamos SQL
2.Preparamos SQL (BD)
2.Ejecutamos SQL (BD)
2."UnPrepare" SQL (BD)
3.Creamos SQL
3.Preparamos SQL (BD)
3.Ejecutamos SQL (BD)
3."UnPrepare" SQL (BD)

Con parámetros:

1.Creamos SQL
1.Pasamos parámetros
1.Preparamos SQL (BD)
1.Ejecutamos SQL (DB)
2.Pasamos parámetros
2.Ejecutamos SQL (DB)
3.Pasamos parámetros
3.Ejecutamos SQL (DB)
3."UnPrepare" SQL (BD)

Contando que lo que más consume en la BD es el "Preparamos SQL" la 
diferencia de hacerlo con parámetros debería ser positiva (sobre el 
papel) especialmente cuanto más compleja sea la sentencia SQL.

> Creo que si uno tiene clara la sentencia y esta no es complicada no creo
> que sea peor indicarla directamente.

Peor no, en teoría más lenta si, en teoría ya que tus resultados 
empíricos parecen demostrar lo contrario.

> Además en otros lenguajes en los que no existen los parámetros, por lo
> que se tiene que hacer mediante cadena. Realmente sigo sin ver por qué
> es más correcto o más adecuado.

Uno y muy importante es la seguridad, imagina un programa que pide un 
nombre de usuario y hace un select con él:

var
   UserName: string;
begin
   SQL.Text='Select * from TTabla where Nombre='''+UserName+''';
   SQL.Open;
end;

Si ejecutas eso con UserName='Jose' todo va bien... pero si lo ejecutas con:

UserName:='''; DELETE * from TTabla; Select * from TTable where Nombre=''';

La cosa no será muy recomendable de ejecutar ;)

Con parámetros no se te da esa situación ya que la sintaxis la mantiene 
en order el sistema de parámetros.

Otra ventaja está en los campos de fecha ya que el sistema de parámetros 
se encarga de dar la fecha en el sistema que espera la base de datos que 
no tiene que ser igual a nuestro "Locale".

Otra más es que por ejemplo entre distintas bases de datos las comillas 
simples y dobles pueden ser necesarias una para cada cosa, 
intercambiables, o con significados diferentes. Este problema lo evita 
el sistema de parámetros.

Espero haberme explicado bien.




More information about the Lazarus-es mailing list