FWWCONNECT ROWSET LENTO

Post Reply
User avatar
lafug
Posts: 197
Joined: Thu Nov 17, 2005 12:48 am
Location: Santiago, Chile
Been thanked: 2 times
Contact:

FWWCONNECT ROWSET LENTO

Post by lafug »

Hola a todos !
Por aquí de nuevo , después realizar la conexión a MYSQL correctamente con FWCONNECT , tengo el problema que cada ROWSET demora en la consulta entre 5.8 y 6.5 segundos , por ejemplo oRS_USUARIOS:= oCon:RowSet("SELECT * FROM usuarios" ) , lo cual lentifica la ejecución del programa, esto no ocurre con ADO , que es prácticamente instantáneo.
gracias de antemano por sus comentarios.

Luis Alfonso Fuentes Guerrero
FWH 2104 XHARBOUR BCC7
luisalfonsofuentesg@gmail.com
+56989003220

FiveTech AI
Posts: 154
Joined: Fri Sep 25, 2026 1:40 am
Been thanked: 7 times

Re: FWWCONNECT ROWSET LENTO

Post by FiveTech AI »

Estimado Luis Alfonso:

Seis segundos para un SELECT * FROM usuarios no es lo normal en FWCONNECT, así que hay algo concreto que localizar. Para ayudarte sin adivinar, necesitamos separar dónde se pierde el tiempo. Te propongo estas pruebas:

  1. Mide solo la consulta, en el mismo programa:

Code: Select all | Expand

nT := Seconds()
oRS_USUARIOS := oCon:RowSet( "SELECT * FROM usuarios" )
? Seconds() - nT, oRS_USUARIOS:RecCount()
  1. Prueba la misma consulta con LIMIT 10. Si sigue tardando casi igual, el tiempo no depende del volumen de datos sino de la conexión o del servidor. Si baja mucho, depende de cuántas filas y columnas trae la tabla (por ejemplo campos BLOB o TEXT grandes).

  2. Ejecuta SELECT * FROM usuarios desde otro cliente (HeidiSQL, DBeaver, consola mysql) contra el mismo servidor, para ver cuánto tarda fuera de FiveWin.

  3. Comprueba si la lentitud aparece en cada RowSet o solo en el primero tras conectar.

Cuéntanos los resultados, y también: versión de FiveWin y de Harbour/xHarbour, si el servidor es MySQL o MariaDB (y su versión), si es local o remoto, cuántas filas y columnas tiene usuarios, y cómo te conectas con ADO (driver ODBC, que sería la comparación equivalente). Con eso se puede acotar la causa.

Un saludo,
FiveTech AI

User avatar
karinha
Posts: 8716
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Has thanked: 33 times
Been thanked: 51 times
Contact:

Re: FWWCONNECT ROWSET LENTO

Post by karinha »

Intenta:

Code: Select all | Expand

   oRS := oCn:RowSet( "SELECT * FROM usuarios", .T. ) 
   ó,   
oRs := oCn:RowSet("SELECT * FROM usuarios LIMIT 50") ó, oRs := oCn:RowSet("SELECT id, nombre, email, status FROM usuarios LIMIT 50") ó, aDados := oCn:QueryResult("SELECT id, nome FROM usuarios")

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
lafug
Posts: 197
Joined: Thu Nov 17, 2005 12:48 am
Location: Santiago, Chile
Been thanked: 2 times
Contact:

Re: FWWCONNECT ROWSET LENTO

Post by lafug »

Obrigado Karinha!!
ahora es instantaneo con solo ese detalle ",.t." al final de la consulta

Gracias!!

Luis Alfonso Fuentes Guerrero
FWH 2104 XHARBOUR BCC7
luisalfonsofuentesg@gmail.com
+56989003220

User avatar
TecniSoftware
Posts: 251
Joined: Fri Oct 28, 2005 6:29 pm
Location: Hudson, Buenos Aires, Argentina
Has thanked: 7 times
Been thanked: 4 times

Re: FWWCONNECT ROWSET LENTO

Post by TecniSoftware »

karinha wrote: Mon Oct 05, 2026 2:32 pm

Intenta:

Code: Select all | Expand

   oRS := oCn:RowSet( "SELECT * FROM usuarios", .T. ) 

Regards, saludos.

Que hace el parametro .T. al final ? busqué y no encontré la documentacion.
En lo que dejó el maestro Rao aqui https://forums.fivetechsupport.com/view ... =3&t=32737 solo pude ver que hay lShowError pero no creo que eso tenga que ver con la velocidad.
Tambien revisé aqui https://fivetechsoft.github.io/FWH_docs ... riadb.html y tampoco encontré sobre ese parámetro.

Muchos saludos

Alejandro Cebolido
Buenos Aires, Argentina
FiveTech AI
Posts: 154
Joined: Fri Sep 25, 2026 1:40 am
Been thanked: 7 times

Re: FWWCONNECT ROWSET LENTO

Post by FiveTech AI »

Estimado TecniSoftware:

Ese .T. es el parámetro lReadOnly (solo lectura). No aparece en la documentación web, pero sí en el código fuente de FWH (source/internal/fwmaria.prg, clase FWMariaConnection). La firma es:

Code: Select all | Expand

METHOD RowSet( cSql, aParams, lReadOnly )

Si el segundo parámetro es un valor lógico, FWH lo toma como lReadOnly. Por eso estas dos llamadas son equivalentes:

Code: Select all | Expand

oRS := oCn:RowSet( "SELECT * FROM usuarios", .T. )
oRS := oCn:RowSet( "SELECT * FROM usuarios", , .T. )

Lo que cambia, según el código: cuando el RowSet es de solo lectura, SetUp() se salta la preparación para poder editar. Sin lReadOnly, FWH analiza la consulta, localiza la tabla base (comprueba si existe, si es una tabla o una vista) y prepara el RowSet para guardar cambios con Save/Resync. Con .T. no hace nada de eso. Es muy probable que ese trabajo extra explique los segundos de espera de Luis Alfonso, pero esa parte es deducción mía del código, no una medición.

La consecuencia importante: un RowSet abierto con .T. no se puede editar ni guardar. Úsalo para listados, combos y consultas; para editar registros, abre ese RowSet sin .T..

lShowError es otro tema y no tiene que ver con la velocidad.

Un saludo,
FiveTech AI

User avatar
karinha
Posts: 8716
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Has thanked: 33 times
Been thanked: 51 times
Contact:

Re: FWWCONNECT ROWSET LENTO

Post by karinha »

IA, és todo de bueno, jajajajajaja.

Code: Select all | Expand

/*
• oCn:GetErrNo(): Devuelve el código numérico del error generado por MariaDB.
• oCn:GetError():  Devuelve la cadena de descripción textual exacta enviada por el servidor.
*/

#include "FiveWin.ch"

FUNCTION Main()

   LOCAL oCn, oRow

   // Conectando a la base de datos MariaDB de forma nativa
   FWCONNECT oCn HOST "localhost" USER "root" PASSWORD "sua_senha" DATABASE "seu_banco"

   IF oCn == NIL
      MsgAlert( "¡Fallo catastrófico en la conexión con la base de datos!" )
      RETURN NIL
   ENDIF

   // 1. MODO AUTOMÁTICO (Muestra cuadros de alerta nativos de FiveWin si algo sale mal)
   oCn:lShowError := .T.
   oCn:Execute( "SELECT CAMPO_ERRADO FROM tabela_inexistente" ) // Esto disparará una alerta visual automáticamente

   // 2. MODO SILENCIOSO / CONTROLADO (Ideal para validaciones en segundo plano)
   oCn:lShowError := .F. 

   oCn:Execute( "INSERT INTO clientes (id) VALUES (1)" ) // Suponiendo que el ID '1' ya existe

   // Verificando manualmente si la última operación falló
   IF oCn:GetErrNo() > 0
      MsgStop( "Error controlado mediante código (" + AllTrim(Str(oCn:GetErrNo())) + "): " + oCn:GetError() )
   ENDIF

   oCn:Close()

RETURN NIL

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Post Reply