Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Efectividad en Mysql (https://www.clubdelphi.com/foros/showthread.php?t=38195)

emeritos 06-12-2006 08:48:27

Efectividad en Mysql
 
Estoy utilizando Delphi7 con Mydac y MySQL.

Estoy dandole de alta a registros de una tabla de esta manera.

Código Delphi [-]
MQnumperdido.Insert;
MQnumperdido.Edit;
MQnumperdido['codigo_mp'] := MQentradamp['codigo_mp'];
MQnumperdido['numero_perdido'] := MQentradamp['n_entrada'];
MQnumperdido.Post;
MQnumperdido.Refresh;

Mi pregunta es : ¿ es efectivo esta manera de hacerlo y que si hay otra mejor cual seria ? .

Gracias.

poliburro 08-12-2006 23:32:02

Oks, El uso de componentes TTable en aplicaciones cliente servidor (Igual para las locales) es una muy mala práctica pues afecta el rendimiento del equipo y de la red al tener que manejar todo el conjunto de datos a la vez (Imagina que la tabla crece hasta 200 000 registros). Por ello lo ideal es hacer uso de Procedimientos almacenados.

Ahora, si no es posible hacer uso de procedimientos almacenados, lo ideal es trabajar sobre un conjunto limitado de registros haciendo uso de objetos TQuery, esto mejorará el rendimiento de tu aplicación.

Espero haberte ayudado con tu duda.


Suerte

emeritos 10-12-2006 20:27:11

Yo utilizo TQuery y solo me gustaria saber si al hacer TQuery.Delete; ejecuta el TQuery.SQLDelete; es decir, la sentencia de sql que hay en esa propiedad.

AzidRain 11-12-2006 03:50:18

No estoy de acuerdo con Poliburro. Tiene razon en parte. Es perfectamente válido usar Insert, Post y Delete con componentes que accesan a tablas MySQL como es el caso. De hecho el componente que utilices (en tu caso MyDAC) se encarga de generar las setencias SQL necesarias para hacer la operación.

Lo que si es un hecho es que hay que tener cuidado con cuantos registros se van a traer por medio de un query. Si son solo unos cuantos no hay tanto problema pero cuidado cuando sean miles.

Un truco que yo uso es tener un Query que me regrese una tabla vacía para hacer las inserciones. Así por ejemplo, si tengo una tabla clientes, uso un TZQuery (yo uso Zeos, pero es igual para otros componentes) y le pongo la sentencia SQL : select * from clientes where ID_Cliente is null (la tabla está diseñada para no permitir que el campo ID_Cliente acepte nulos por lo que la sentencia anterior siempre devuelve una tabla vacía). Con este query hago las inserciones sin ningún problema usando solo comandos "normales" de Delphi.

El meollo del asunto es tener cuidado con la cantidad de registros que traes mediante un Query, como ya comenté.

emeritos 11-12-2006 15:41:51

Sobre las inserciones te agradezco el truco.

Pero para las modificaciones y eliminaciones, que se te tienes que traer parte de los datos, seria aceptable utilizar el TQuery.delete o TQuery.Post.

Gracias.

AzidRain 11-12-2006 17:26:11

Es lo mismo... Si haces un TQuery.Delete el query manda una sentencia "DELETE FROM TABLE..." y el post hace un "UPDATE TABLE..." o "INSERT INTO ..." segun lo que estés haciendo (insertando un registro o editandolo).

De manera que:
Para insertar...
Código Delphi [-]
MQnumperdido
MQnumperdido.Insert;
MQnumperdido.Edit;  {<---Este Edit sobra, Insert pone el query en Edit en automático}
MQnumperdido['codigo_mp'] := MQentradamp['codigo_mp'];
MQnumperdido['numero_perdido'] := MQentradamp['n_entrada'];
MQnumperdido.Post;
MQnumperdido.Refresh; {Este refresh no se si valga la pena...}

Para borrar un registro actual...
Código Delphi [-]
{--- Suponiendo que el registro actual es el que queremos borrar --}

MQnumperdido.Delete
No importa si el query de donde borramos solo contiene unas cuantas filas o incluso una sola, el registro se borra de la tabla completamente...es decir...

si tengo un query "SELECT * FROM CLIENTES" y otro "SELECT * FROM CLIENTES WHERE NOMBRE LIKE '%COMPANY%' " en ambos casos hacer un delete a cualquier registro nos da el mismo resultado: la eliminación, en este caso del cliente, de la tabla. Obviamente el primer Query tardará mas en abrirse que el segundo antes de poder hacer el TQuery.Delete.

Ojo...Usar los metodos del TQuery solo funciona si el query que utilizas es de una sola tabla, si incluye joins o alguna otra cosa relacionada con mas de 1 tabla no es posible. Esto debido a que la mayoría de los motores no permiten editar sentencias multitablas.


La franja horaria es GMT +2. Ahora son las 18:36:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi