Procedimientos para manejar base de datos SQLite con FIREDAC

PROCEDIMIENTOS PARA EL MANEJO DE UNA BASE DE DATOS SQLITE CON FIREDAC REALIZADOS CON RAD STUDIO BERLÍN 10.1

Continuando con la explicación sobre cómo se hizo la app MilSeñales, hoy me toca hablar sobre diferentes procedimientos relacionados con la base de datos SQLITE.
Tenéis que tomar nota que con el driver DBExpress sería muy parecido salvo en lo referente a la encriptación.

Componentes que he usado:

SenalesConnection : TFDConnection
SQLQuery1: TFDQuery
FDTransaction1:TFDTransaction
FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink
FDSqliteBackup1: TFDSqliteBackup1
FDSQLiteValidate1:TFDSQLiteValidate1
FDSQLiteSecurity1:FDSQLiteSecurity1

Aquí tenéis las propiedades del objeto "SenalesConnection" que es donde se hace la conexión con la base de datos llamada "senales.db"


Conectando un objeto FDTransaction con el componente FDConnection os pemitirá utilizar transacciones en vuestras consultas, lo que redundará en una base de datos más estable ante bloqueos, cuelgues de la app o situaciones que puedan comprometer la integridad de la misma, además el utilizar transacciones mejora notablemente el rendimiento de la base de datos, yo he llegado a realizar consultas / inserciones, que sin utilizar transacciones tardaban 2 minutos y con transacciones eran sólo 3 segundos.


PROCEDIMIENTOS:

-Abrir una base de datos

PROCEDURE TForm1.AbrirBD;
var
 RutaBD, EstaEncriptada, PasswordBD,RutaBD: STRING;
BEGIN
  IF NOT SenalesConnection.connected THEN
  BEGIN
   PasswordBD := '123456'; // o lo que queráis
  RutaBD := 'c:\'+ 'senales.db';

  WITH SenalesConnection DO
  BEGIN
    Close;

    WITH Params DO
    BEGIN
      Clear;
      Add('DriverID=SQLite');
      Add('Database=' + RutaBD);
      Add('SharedCache=True');
      Add('LockingMode=Normal');

      WITH FDSQLiteSecurity1 DO
      BEGIN
        Database := RutaBD;
        password := PasswordBD;
      END;

      EstaEncriptada := FDSQLiteSecurity1.CheckEncryption;
      IF EstaEncriptada <> 'unencrypted' THEN
      BEGIN
        Add('Password=' + PasswordBD);
      END
      ELSE
      BEGIN
        Add('Password=');
      END;
    END;
  END;
    TRY
      // Establece la conexion
      SenalesConnection.connected := true;
    EXCEPT
      ON e: EDatabaseError DO
        showmessage('Exception raised with message: ' + e.Message);
    END;

    IF NOT SenalesConnection.connected THEN
      showmessage('no se ha activado la BD');

    WITH SQLQuery1 DO
    BEGIN
      Close;
      prepared := false;
      sql.Clear;
      Params.Clear;
    END;
  END;
END;

-EJECUTAR QUERY DE TIPO " INSERT, UPDATE, DELETE, CREATE TABLE"
 
 IF NOT SenalesConnection.connected THEN
    SenalesConnection.connected := true;
  SQLQuery1.Close;
  SQLQuery1.prepared := false;
  SQLQuery1.sql.Clear;
  SQLQuery1.Params.Clear;
  SQLQuery1.sql.Add(textoSQL);

  SenalesConnection.StartTransaction;
  TRY
    SQLQuery1.ExecSQL;
   
    SenalesConnection.commit;
  EXCEPT
    ON e: Exception DO
    BEGIN
      SenalesConnection.rollback;
      SQLQuery1.active := false;
      showmessage('error en Exec SQL: ' + e.Message);
    END;
  END;

-EJECUTAR QUERY CON UN SELECT


IF NOT SenalesConnection.connected THEN
    SenalesConnection.connected := true;

  SQLQuery1.Close;
  SQLQuery1.prepared := false;
  SQLQuery1.sql.Clear;
  SQLQuery1.Params.Clear;
  SQLQuery1.sql.Add(textoSQL);

  SenalesConnection.StartTransaction;
  TRY
    SQLQuery1.active := true; 
    SenalesConnection.commit;
  EXCEPT
    ON e: Exception DO
    BEGIN
      SenalesConnection.rollback;
      SQLQuery1.active := false;
      showmessage('Error en Query: ' + e.Message + '. Texto sql: ' +
        textoSQL);
    END;
  END;

  IF SQLQuery1.active THEN
    SQLQuery1.first;

- ENCRIPTAR UNA BASE DE DATOS SQLITE

 
VAR
  EstaEncriptada: STRING;

BEGIN
 SenalesConnection.connected := False;
  EstaEncriptada := FDSQLiteSecurity1.CheckEncryption;
  IF EstaEncriptada = 'unencrypted' THEN
  BEGIN
   FDSQLiteSecurity1.password := 'aes-512':passwordBD;
    FDSQLiteSecurity1.SetPassword;
  END;
END;

- DESENCRIPTAR UNA BASE DE DATOS SQLITE

  SenalesConnection.connected := False;
  EstaEncriptada := FDSQLiteSecurity1.CheckEncryption;
  IF EstaEncriptada <> 'unencrypted' THEN
  BEGIN

    FDSQLiteSecurity1.Database := 'c:\senales.db';
   FDSQLiteSecurity1.password :='123456';
   FDSQLiteSecurity1.RemovePassword;
   SenalesConnection.Params.password := '';
  END;

- CAMBIAR CLAVE DE UNA BASE DE DATOS SQLITE


  SenalesConnection.connected := False;
  FDSQLiteSecurity1.Database :='c:\senales.db';
  FDSQLiteSecurity1.password := tipoEncrypt + ':' + passwordBD;;
  FDSQLiteSecurity1.ToPassword :='aes-512:625252';
  FDSQLiteSecurity1.ChangePassword;

- VER ESTADO DE UNA BD SQLITE


  SenalesConnection.connected := False;
  FDSQLiteSecurity1.Database :='c:\senales.db';
  FDSQLiteSecurity1.password := '123456';
  LbEstado.Text := FDSQLiteSecurity1.CheckEncryption;

- OPTIMIZAR UNA BD SQLITE


  FDSQLiteValidate1.Database  :='c:\senales.db';
  FDSQLiteValidate1.Sweep;




1 comentario: