Me refiero a usar las colecciones connection.tables y connection.tables[n].fields.
En algunas aplicaciones he llegado a crear mi propio diccionario de datos en una tabla llamada Campos dentro de una base de datos de sqlite .config, con la información necesaria sobre los campos de todas las tablas manejadas por la aplicación, a saber: nombre de la base de datos,nombre de la tabla, nombre del campo, tipo, ancho, si es clave primaria, si puede ser nulo, valor por defecto, comentarios y titulo para los formularios.
En el momento de la configuración de la aplicación (primera ejecución), se crea este "Diccionario de campos" y luego la velocidad de manejo de los datos se incrementa de manera exponencial.
Últimamente ya no uso esa técnica, la he cambiado por un par de funciones que hacen el mismo papel y, casi, en el mismo tiempo...
Sólo pongo aquí el desahogo quejica de la lentitud de tales clases de gambas.
Ejemplo:
Suponte que quieres conocer el tamaño de cada uno de los campos de una tabla para formatear el ancho de las columnas de un gridview, por ejemplo.
Siguiendo las clases de gambas harías algo así:
Corto, sencillo y claro.... pero en casa me tarda 6 segundos en recorrer una tabla con 37 campos.
Si por el contrario lo hace tú "a pelo" con algo así (en una base MySQL) harías algo así:
dim anchostabla as integer[]
dim alinea as string[]
dim r as result
r = mComun.datos.Exec("show fields from " & mitabla)
While r.available
Select Case r!Type
Case "text"
anchostabla.Add(100) 'un ancho estándar para campos sin longitud
Case "date"
anchostabla.Add(80) 'un ancho estándar para fechas
Case Else
cad = Split(r!Type, "(,)")
If cad.count > 2 Then
anchostabla.Add(Val(cad[1]))
Else
anchostabla.Add(-1) 'para todo lo demás Mastercard
Endif
End Select
r.movenext
Wend
dim alinea as string[]
dim r as result
r = mComun.datos.Exec("show fields from " & mitabla)
While r.available
Select Case r!Type
Case "text"
anchostabla.Add(100) 'un ancho estándar para campos sin longitud
Case "date"
anchostabla.Add(80) 'un ancho estándar para fechas
Case Else
cad = Split(r!Type, "(,)")
If cad.count > 2 Then
anchostabla.Add(Val(cad[1]))
Else
anchostabla.Add(-1) 'para todo lo demás Mastercard
Endif
End Select
r.movenext
Wend
Más engorroso, más líneas de código, más llamadas a funciones...y tarda menos de un segundo.
Pareciera que las clases de gambas, cada vez que releen la estructura tuvieran que volver a acceder al servidor para cada iteracción... no sé, no sé, pero es un follón.