Cómo obtener la lista de todas las tablas y consultas en una base de datos (Paradox, Access, etc.) usando la BDE

Obteniendo la lista de todas las tablas y consultas de una base de datos usando la BDE

Copyright © 2000 Ernesto De Spirito

Help & Manual authoring tool

DbiOpenTableList

Si necesita conocer los nombres de todas las tablas y/o consultas (vistas) en una base de datos abierta con la BDE (Paradox, Access, etc.), puede usar DbiOpenTableList para crear un cursor* con todos los nombres de tablas y consultas, y luego puede leerlo llamando a DbiGetNextRecord como se muestra en el ejemplo de abajo que guarda los nombres en un cuadro de lista (ListBox), indicando si corresponden a una tabla o a una consulta.

(*) Un cursor, para quienes no están al día en la terminología de las bases de datos, es una "tabla lógica". Por ejemplo cuando abrimos una tabla o consulta, lo que obtenemos es un cursor, es decir, un conjunto de datos distribuidos en filas o en columnas, independientemente que esos datos provengan de una tabla física, de parte de una tabla, de muchas tablas o de cualquier otra fuente de datos.

Para probar el ejemplo, simplemente coloque un ListBox y un Button (botón) en un formulario, y genere el manejador del evento OnClick del botón:

uses db, dbtables, bde;  // No se olvide de incluir la unidad BDE!

procedure TForm1.Button1Click(Sender: TObject);
var
  db1: TDatabase;
  hCursor: hDBICur;        // Cursor con los nombres de tablas y
                           // consultas
  ListDesc: TBLBaseDesc;   // Registro del cursor
begin
  ListBox1.Clear;
  db1 := nil;
  try
    db1 := TDatabase.Create(nil);
    // Establezca las propiedades necesarias para abrir su base de
    // datos
    db1.DatabaseName := 'Access_ODBC_Test';
    db1.LoginPrompt := False;

    db1.Connected := True;

    // Generar el cursor con los nombres de tablas y consultas
    Check(DbiOpenTableList(db1.Handle, False, False, '*', hCursor));

    // Moverse por los registros del cursor para obtener los nombres
    while (DbiGetNextRecord(hCursor, dbiNOLOCK, @ListDesc, nil)
          = dbiErr_None) do
      if ListDesc.bView then  // ¿Es una consulta?
        ListBox1.Items.Add(ListDesc.szName + ' (Consulta)')
      else
        ListBox1.Items.Add(ListDesc.szName + ' (Tabla)');
     // Cerrar el cursor
    dbiCloseCursor(hCursor);

    db1.Connected := False;
  except
    db1.Free;
    raise;
  end;
  db1.Free;
end;

En lugar de una variable de tipo TDatabase creada para el propósito, puede usar un control TDatabase colocado en un formulario, o la propiedad Database de un control TTable o TQuery.

Boycott Trend Micro!