Hay dos maneras, que yo sepa:
-Recorrer la colección de campos (fields) de la tabla de la conexión (o sea: miconexión.tables[mitabla].fields)
-Hacer una consulta y recorrer los resultfields del result.
Suponiendo de antemano que la primera opción es más rápida, por cuanto no hay que bajar datos sólo definiciones (Según el manual de gambas un objeto table es una definición de una tabla), he comparado los dos métodos y me he llevado una sorpresa.
Con una tabla que contiene 44 campos, sobre un servidor mysql que reside en los USA, el primer método me tarda 20 segundos. El segundo método ¡medio segundo!
El código seguido es éste:
dim miconexion as connection
dim tabla as table
dim r as result
dim cad as string
dim tcampo as field
dim campo as resultfield
.... configuamos la conexión y ...
miconexion.open
PRINT "primer bucle inicio: " & Now
ttabla = miconexion.Tables[tabla]
FOR EACH tcampo IN ttabla.Fields
cad = If(Len(cad) < Len(tcampo.Name), tcampo.Name, cad)
NEXT
PRINT "primer bucle final: " & Now
PRINT cad
PRINT "segundo bucle inicio: " & Now
r = miconexion.EXEC("select * from " & ME.Tag.tabla & " limit 1") 'limit 1 para no traer los mínimos datos posibles"
FOR EACH campo IN r.Fields
cad = If(Len(cad) < Len(campo.Name), campo.Name, cad)
NEXT
PRINT "segundo bucle final:" & Now
PRINT cad
dim tabla as table
dim r as result
dim cad as string
dim tcampo as field
dim campo as resultfield
.... configuamos la conexión y ...
miconexion.open
PRINT "primer bucle inicio: " & Now
ttabla = miconexion.Tables[tabla]
FOR EACH tcampo IN ttabla.Fields
cad = If(Len(cad) < Len(tcampo.Name), tcampo.Name, cad)
NEXT
PRINT "primer bucle final: " & Now
PRINT cad
PRINT "segundo bucle inicio: " & Now
r = miconexion.EXEC("select * from " & ME.Tag.tabla & " limit 1") 'limit 1 para no traer los mínimos datos posibles"
FOR EACH campo IN r.Fields
cad = If(Len(cad) < Len(campo.Name), campo.Name, cad)
NEXT
PRINT "segundo bucle final:" & Now
PRINT cad
No es un tema de cachés, porque he invertido el orden de los dos bucles y el resultado es el mismo.
La pregunta es ¿Alguien sabe si mencionar Table implica descargar los datos de la tabla? Según el manual "Table contiene una definición de una tabla", pero cuarenta veces más lento me dice que ahí pasa algo raro... ¿no?