Voy a mostraros un ejemplo de conexión con una base de datos de INTERBASE o FIREBIRD mostrando el resultado directamente dentro de un componente ListView, aunque con unas modificaciones se puede lanzar el resultado a un archivo de texto, página web, XML o lo que sea.
Lo primero es conectar con la base de datos:
function ConectarBaseDatos( sBaseDatos: String ): TIBDatabase;
var DB: TIBDatabase;
begin DB := TIBDatabase.Create( nil );
DB.Name := 'IB';
DB.DatabaseName := '127.0.0.1:' + sBaseDatos;
DB.Params.Add( 'user_name=SYSDBA' );
DB.Params.Add( 'password=masterkey' );
DB.SQLDialect := 3;
DB.LoginPrompt := False;
try
DB.Open;
except
raise Exception.Create( 'No puedo conectar con INTERBASE/FIREBIRD.' + #13 + #13 + 'Consulte con el administrador del programa.' );
end;
Result := DB;
end;
Si nos fijamos en el procedimiento, primero se crea en tiempo real un componente de conexión a bases de datos TIBDatabase. Después le decimos con que IP va a conectar (en principio en nuestra misma máquina) y la ruta de la base de datos que es la que se le pasa al procedimiento.
Más adelante le damos el usuario y password por defecto y desactivamos en Login. Finalmente contectamos con la base de datos controlando la excepción si casca.
Un ejemplo de conexión sería:
var DB: TIBDatabase;
DB := ConectarBaseDatos( 'c:\bases\bases.gdb' ); // PARA INTERBASE Ó
DB := ConectarBaseDatos( 'c:\bases\bases.fdb' ); // PARA FIREBIRD
if DB = nil then
Exit;
Una vez conectados a la base de datos vamos a ver como listar los registros de una tabla dentro de un ListView:
procedure ListarTabla( DB: TIBDatabase; sTabla: String; Listado: TListView );
var Campos: TStringList;
i: Integer;
Consulta: TIBSQL;
Transaccion: TIBTransaction;
begin
if DB = nil then Exit;
// Creamos un stringlist para meter los campos de la tabla
Campos := TStringList.Create;
DB.GetFieldNames( sTabla, Campos );
// Creamos una transacción para la consulta
Transaccion := TIBTransaction.Create( nil );
Transaccion.DefaultDatabase := DB;
// Creamos una consulta
Consulta := TIBSQL.Create( nil );
Consulta.Transaction := Transaccion;
Consulta.SQL.Add( 'SELECT * FROM ' + sTabla );
Transaccion.StartTransaction;
try
Consulta.ExecQuery;
except
Transaccion.Rollback;
raise;
end;
// Creamos en el listview una columna por cada campo
Listado.Columns.Clear;
Listado.Columns.Add;
Listado.Columns[0].Width := 0;
for i := 0 to Campos.Count - 1 do
begin
Listado.Columns.Add;
Listado.Columns[i+1].Caption := Campos[i];
Listado.Columns[i+1].Width := 100;
end;
// Listamos los registros
Listado.Clear;
while not Consulta.Eof do
begin
Listado.Items.Add;
for i := 0 to Campos.Count - 1 do
Listado.Items[Listado.Items.Count-1].SubItems.Add( Consulta.FieldByName(
Campos[i] ).AsString );
Consulta.Next;
end;
// Una vez hemos terminado liberamos los objetos creados
FreeAndNil( Campos );
FreeAndNil( Consulta );
FreeAndNil( Transaccion );
end;
Por supuesto, todo este proceso se puede mejorar refactorizando código y dividiendo las partes más importantes en clases más pequeñas. Haciendo muchas pruebas con objetos TIBSQL y TIBQuery me he dado cuenta que para operaciones donde se requiere velocidad los objetos TIBSQL con mucho más rápidos que los TIBQuery, aunque estos últimos son mucho más completos.
Pruebas realizadas en Delphi 7
No hay comentarios:
Publicar un comentario