* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 16, 2024, 06:27:23 am

Inserisci il nome utente, la password e la durata della sessione.

68 Visitatori, 0 Utenti

Autore Topic: leggere tabelle di DB SQLite3 con Zeos  (Letto 6426 volte)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #45 il: Aprile 20, 2021, 03:26:47 pm »
Codice: [Seleziona]
 numID:= LoadCursorFromLazarusResource(col1);    // dovrebbe leggere il contenuto della colonna 1 della tabella corrente del DB

Non penso che quello ti ritorni il valore contenuto nel campo 'col1', ha a che fare con tuttaltro.

Tramite Interfaccia non conosco la funzione da chiamare, ma penso che sia tramite

Codice: [Seleziona]
rs.getRow
Convengo con te che "LoadCursorFromLazarusResource(col1)" non dia il risultato desiderato, ma il comando "cursor.get[xxxxx](indice)", che ho trovato nella miniguida di Stilgar non viene riconosciuto, perciò non ho potuto portare a termine la prova. Quel Load... li, effettivamente non nha funzionato, ma mi ha permesso di terminare la prova. Il mio problema è che non riesco a trovare la sintassi corretta per il mio scopo, nè riesco ad immaginarmela.

il comando "rs.getRow", come mi ha attenzionato Stilgar qui, fornisce solamente un contatore inizializzato a 0(zero), pronto per essere incrementato attraverso un ciclo del tipo "while rs.next do ".

ciao ciao

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #46 il: Aprile 20, 2021, 09:05:09 pm »
Ciao.
Stiamo parlando di software open source in fin dei conti.
 Ctrl+Click e si aprono i sorgenti  ;D  Non serve la guida.
Codice: [Seleziona]
    function IsNull(ColumnIndex: Integer): Boolean;
    function GetPChar(ColumnIndex: Integer): PChar;
    function GetPAnsiChar(ColumnIndex: Integer): PAnsiChar; overload;
    function GetPAnsiChar(ColumnIndex: Integer; out Len: NativeUInt): PAnsiChar; overload;
    function GetString(ColumnIndex: Integer): String;
    {$IFNDEF NO_ANSISTRING}
    function GetAnsiString(ColumnIndex: Integer): AnsiString;
    {$ENDIF}
    {$IFNDEF NO_UTF8STRING}
    function GetUTF8String(ColumnIndex: Integer): UTF8String;
    {$ENDIF}
    function GetRawByteString(ColumnIndex: Integer): RawByteString;
    function GetBinaryString(ColumnIndex: Integer): RawByteString; deprecated;
    function GetUnicodeString(ColumnIndex: Integer): ZWideString;
    function GetPWideChar(ColumnIndex: Integer): PWideChar; overload;
    function GetPWideChar(ColumnIndex: Integer; out Len: NativeUInt): PWideChar; overload;
    function GetBoolean(ColumnIndex: Integer): Boolean;
    function GetByte(ColumnIndex: Integer): Byte;
    function GetShort(ColumnIndex: Integer): ShortInt;
    function GetWord(ColumnIndex: Integer): Word;
    function GetSmall(ColumnIndex: Integer): SmallInt;
    function GetUInt(ColumnIndex: Integer): Cardinal;
    function GetInt(ColumnIndex: Integer): Integer;
    function GetULong(ColumnIndex: Integer): UInt64;
    function GetLong(ColumnIndex: Integer): Int64;
    function GetFloat(ColumnIndex: Integer): Single;
    function GetDouble(ColumnIndex: Integer): Double;
    function GetCurrency(ColumnIndex: Integer): Currency;
    function GetBigDecimal(ColumnIndex: Integer): Extended;
    function GetBytes(ColumnIndex: Integer): TBytes;
    function GetDate(ColumnIndex: Integer): TDateTime;
    function GetTime(ColumnIndex: Integer): TDateTime;
    function GetTimestamp(ColumnIndex: Integer): TDateTime;
    function GetAsciiStream(ColumnIndex: Integer): TStream;
    function GetUnicodeStream(ColumnIndex: Integer): TStream;
    function GetBinaryStream(ColumnIndex: Integer): TStream;
    function GetBlob(ColumnIndex: Integer): IZBlob;
    function GetDataSet(ColumnIndex: Integer): IZDataSet;
    function GetValue(ColumnIndex: Integer): TZVariant;
    function GetDefaultExpression(ColumnIndex: Integer): string;
    //======================================================================
    // Methods for accessing results by column name
    //======================================================================
    function IsNullByName(const ColumnName: string): Boolean;
    function GetPCharByName(const ColumnName: string): PChar;
    function GetPAnsiCharByName(const ColumnName: string): PAnsiChar; overload;
    function GetPAnsiCharByName(const ColumnName: string; out Len: NativeUInt): PAnsiChar; overload;
    function GetStringByName(const ColumnName: string): String;
    {$IFNDEF NO_ANSISTRING}
    function GetAnsiStringByName(const ColumnName: string): AnsiString;
    {$ENDIF}
    {$IFNDEF NO_UTF8STRING}
    function GetUTF8StringByName(const ColumnName: string): UTF8String;
    {$ENDIF}
    function GetRawByteStringByName(const ColumnName: string): RawByteString;
    function GetBinaryStringByName(const ColumnName: string): RawByteString; deprecated;
    function GetUnicodeStringByName(const ColumnName: string): ZWideString;
    function GetPWideCharByName(const ColumnName: string): PWideChar; overload;
    function GetPWideCharByName(const ColumnName: string; out Len: NativeUInt): PWideChar; overload;
    function GetBooleanByName(const ColumnName: string): Boolean;
    function GetByteByName(const ColumnName: string): Byte;
    function GetShortByName(const ColumnName: string): ShortInt;
    function GetWordByName(const ColumnName: string): Word;
    function GetSmallByName(const ColumnName: string): SmallInt;
    function GetUIntByName(const ColumnName: string): Cardinal;
    function GetIntByName(const ColumnName: string): Integer;
    function GetULongByName(const ColumnName: string): UInt64;
    function GetLongByName(const ColumnName: string): Int64;
    function GetFloatByName(const ColumnName: string): Single;
    function GetDoubleByName(const ColumnName: string): Double;
    function GetCurrencyByName(const ColumnName: string): Currency;
    function GetBigDecimalByName(const ColumnName: string): Extended;
    function GetBytesByName(const ColumnName: string): TBytes;
    function GetDateByName(const ColumnName: string): TDateTime;
    function GetTimeByName(const ColumnName: string): TDateTime;
    function GetTimestampByName(const ColumnName: string): TDateTime;
    function GetAsciiStreamByName(const ColumnName: string): TStream;
    function GetUnicodeStreamByName(const ColumnName: string): TStream;
    function GetBinaryStreamByName(const ColumnName: string): TStream;
    function GetBlobByName(const ColumnName: string): IZBlob;
    function GetDataSetByName(const ColumnName: String): IZDataSet;
    function GetValueByName(const ColumnName: string): TZVariant;


    //=====================================================================
    // Advanced features:
    //=====================================================================


    function GetWarnings: EZSQLWarning;
    procedure ClearWarnings;


    function GetCursorName: String;
    function GetMetadata: IZResultSetMetadata;
    function FindColumn(const ColumnName: string): Integer;


Ho provato ad eseguire la query:
Codice: [Seleziona]
20/04/2021 20:45:25: SQL Error: near "as": syntax error  <SELECT fields[1] as col1 FROM Note ORDER BY col1 DESC LIMIT 1>
20/04/2021 20:45:33: SQL Error: no such column: fields  <SELECT fields[1] FROM Note ORDER BY col1 DESC LIMIT 1>

La query da lanciare (se ho capito quello che vuoi fare) è :
Codice: [Seleziona]
SELECT max(RowId) FROM laTuaTabella

(Sempre che tu non abbia creato la tabella in modo che il rowid non venga generato, non serve nemmeno la sequance con l'autoincrement per puntare alla riga).



Se stai estraendo un intero dalla prima colonna:
Codice: [Seleziona]
rs.getLong(1);
o
rs.getInt(1);


Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #47 il: Aprile 20, 2021, 10:40:15 pm »
@ Stilgar

A fatica, ma ho capito:
Codice: [Seleziona]
  sql:= 'SELECT max(RowId) FROM ' + nmTabDB;
  rs:= stmt.ExecuteQuery(sql);
  numID:= rs.GetInt(1);    // legge il contenuto della colonna ID(col.1) dell'ultima riga della tabella corrente del DB
  Result:= numID;                 

Risultato:
Citazione
numID = 59936
var
 numID: Integer = longint
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/daContDom_aDomusRatio/frmmain.pas(1187,3)
L'ho verificato col DB Browser: --> ("SELECT max(RowId) FROM movimgg" = 59936)
 :D :D :D
ciao ciao

moessner

  • Newbie
  • *
  • Post: 27
  • Karma: +0/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #48 il: Giugno 13, 2021, 01:54:51 pm »
Dimenticavo,
 
Uso componenti ZEOS LIB

ed ho definito il protocollo=sqlite-3   nel Zconnection

Grazie ancora
Moessenr

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #49 il: Agosto 29, 2021, 07:12:37 pm »
Riprendo questa mia vecchia discussione perchè, andando avanti nell'apprendimento di come accedere ad un DB e trattare le tabelle in esso contenute, ho rivisto i comandi adoperati recentemente in un programma per la la Open del DB:
Codice: [Seleziona]
...
var
 FConn: IZConnection;
  stmt  :IZStatement;
  rs  :IZResultSet;   
...
  striMia:= DriverManager.ConstructURL(CurrentProtocol, '', '/media/dirdati/dativari/contabfam/Fragola', '', '', 0, nil);     // Il DB Fragola non esiste ma vorrei che me lo dicesse il programma

  FConn:= DriverManager.GetConnection(striMia);  // prepara l’accesso al DB, cercandolo
try
  stmt:= FConn.CreateStatement;  // eseguela Open del DB
  except
    on e: Exception do
    begin
          ShowMessage('DB NON trovato');
    end;
  end;                                                   
Speravo che venisse sollevata un'eccezione, invece non è successo niente.
Sicuramente ho sbagliato io, ma non capisco dove.

Pensavo di poterl
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #50 il: Agosto 29, 2021, 09:27:41 pm »
Non ha ancora usato ZeosDB in maniera completa.
Però penso che l'apertura di una connessione non generi eccezioni: forse le genereranno le istruzioni successive (come ad esempio il tentativo di apertura di una tabella).

Tramite la connessione, ritengo che si possano aggiungere tabelle, creare nuovi campi, etc ..., quindi la connessione esiste anche in un db "inesistente" ossia vuoto da "costruire".

Magari mi sbaglio, lascio il chiarimento ai professionisti del DB.

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #51 il: Agosto 29, 2021, 10:50:16 pm »
Non ha ancora usato ZeosDB in maniera completa.
Però penso che l'apertura di una connessione non generi eccezioni:
Si, è così. Ho provato in debug ed ho visto chiaramente che l'eccezione non viene generata.

Ho modificato il passo di istruzioni così:
Codice: [Seleziona]
 striMia:= DriverManager.ConstructURL(CurrentProtocol, '', '/media/dirdati/dativari/contabfam/Fragola', '', '', 0, nil);
  try
  FConn:= DriverManager.GetConnection(striMia);  // prepara l’accesso al DB, cercandolo
  except
    on e: Exception do
    begin
      ShowMessage('DB NON trovato');
    end;
  end;
  stmt:= FConn.CreateStatement;  // eseguela Open del DB
//-----------
  sql:= 'SELECT DtCoMovg FROM riepmovg';
  try
  rs:= stmt.ExecuteQuery(sql);
  totRecQry:= rs.GetRow;    // "totquery" viene impostato a 0(puntamento primo record della query contenuta in sql)
  while rs.next do
  begin
    totRecQry:= totRecQry + 1;
  end;
  except
     on e: Exception do
     begin
         writeln(e.Message);
     end;
  end;
  ShowMessage('record letti in "riepmovg"= ' + IntToStr(totRecQry)); 
Anche così, al primo try l'eccezione non viene generata, mentre viene generata quando il programma tenta di leggere una tabella del DB.
A quel punto però è troppo tardi per capire che l'Errore risale all'inesistenza del DB, sia perchè il momento è diverso, sia perchè il messaggio ricavato nell'except a me non risulta chiaro:



ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #52 il: Agosto 29, 2021, 11:07:48 pm »
Ho modificato ulteriormente il passo di programma:
Codice: [Seleziona]
 striMia:= DriverManager.ConstructURL(CurrentProtocol, '', '/media/dirdati/dativari/contabfam/Fragola', '', '', 0, nil);
  try
  FConn:= DriverManager.GetConnection(striMia);  // prepara l’accesso al DB, cercandolo
  except
    on e: Exception do
    begin
      ShowMessage('DB NON trovato');
    end;
  end;
  stmt:= FConn.CreateStatement;  // eseguela Open del DB
//-----------
  sql:= 'SELECT DtCoMovg FROM riepmovg';
  try
  rs:= stmt.ExecuteQuery(sql);
  except
     on e: Exception do
     begin
         writeln(e.Message);
     end;
  end;
  totRecQry:= rs.GetRow;    // "totquery" viene impostato a 0(puntamento primo record della query contenuta in sql)
  try
  while rs.next do
  begin
    totRecQry:= totRecQry + 1;
  end;
  except
     on e: Exception do
     begin
         writeln(e.Message);
     end;
  end;
  ShowMessage('record letti in "riepmovg"= ' + IntToStr(totRecQry));               

Questa volta il messaggio relativo al sollevamento dell'eccezione risulta un pò più chiaro, in quanto si capisce dove viene sollevata l'eccezione. In ogni caso non si capisce perchè, infatti il fatto che il n° di record letti sia 0, può essere anche dovuto al fatto che la tabella, pur esistendo, non sia stata ancora riempita.
ciao ciao

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #53 il: Agosto 30, 2021, 07:56:59 am »
Non conosco Zeos, preferisco usare ciò che mette già a disposizione Lazarus, se però non dovessi trovare altre strade, puoi sempre fare un controllo preventivo ed emettere un errore se il DB non esiste, usando la FileExist, in caso contrario, procedi con la connessione.

Ciao, Mario

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #54 il: Agosto 30, 2021, 09:48:28 am »
Io normalmente per i database faccio così:

- Verifico che il file database esista (*);

- Ho sempre una tabella VER: mantiene la versione del database (legata al mio prodotto ovviamente) (*);

- Se la tabella VER non esiste il database è vuoto (*);

- Se il primo record di VER ha un contenuto diverso da quello che mi aspetto, allora eseguo una ALTER TABLE su tutte le tabelle del database per adeguare i campi.

(*) Queste eventualità adesso mi generano un messaggio utente, solo in un vecchissimo progetto creai delle tabelle tramite SQL a codice.

Devo vedere come testatavo le varie condizioni, e poi come riportarle in ZEOS.

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #55 il: Agosto 30, 2021, 09:59:19 am »
puoi sempre fare un controllo preventivo ed emettere un errore se il DB non esiste, usando la FileExist, in caso contrario, procedi con la connessione.
Ho accolto piacevolmente il tuo consiglio, perchè era proprio quello che avevo pensato di fare stamani, prima d' accendere il pc.

@ DragoRosso:
Grazie per il tuo suggerimento. Tuttavia, io credo che, utilizzando SQLite3, in cui il DB risiede in un unico File, controllare anche l'esistenza delle singole tabelle, sia, a mio avviso, uno sforzo che posso risparmiarmi, daltronde io non scrivo programmi destinati all'uso di terzi.
Verificare la presenza di record all'interno delle tabelle è effettivamente un'altra cosa. Ci penso un pò su.
Grazie.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:leggere tabelle di DB SQLite3 con Zeos
« Risposta #56 il: Agosto 30, 2021, 10:11:19 am »
QUESTO è il codice usato con il cugino più quotato di Lazarus con SQLite.
Penso sia facilmente adattabile in ZEOS (se non è addirittura già compatibile).

Il codice è incompleto, alcune variabili potrebbero essere non dichiarate in questa funzione, ma il concetto dovrebbe essere chiaro.

Le istruzioni SQL CREATE TABLE e consecutive sono copiate pari pari dai tool di generazione dei database di terze parti (tipo SQLiteStudio).

Scusate la forma ma è codice vecchio di oltre quindici anni.

Codice: [Seleziona]
function TFProgVision.DB_Check(const sNomeDB: WideString; var sErrore: WideString): LongWord;
var tempelenco: TStringList;
    tempflag: boolean;
    VersioneDB: string;
    tempstr: string;
    i: Integer;
    tempResult: integer;
const
    tempDBList: array [0..6] of string = ('VisSubPassi', 'VisVerificaColore', 'VisMediaBinaria', 'VisConteggioFronti', 'VisFeltrini', 'VisSequenze', 'VisOCV');
    tempDBStepList: array [0..17] of string = ('DataOraUTC', 'Prg', 'SX', 'SubPasso', 'EsitoPasso', 'TipoControllo', 'ColoreControllo', 'ColoreLimiteLow', 'ColoreLimiteHigh', 'ScattaFoto', 'Exp1', 'Exp2', 'Exp3', 'Exp4', 'Exp5', 'Exp6', 'Exp7', 'Exp8');
    zero: integer = 0;
type
    tempDBtipo = (VisSubPassi=0, VisVerificaColore=1, VisMediaBinaria=2, VisConteggioFronti=3, VisFeltrini=4, VisSequenze=5, VisOCV=6);
begin
  result := ord(App_NoErrore);
  sErrore := ErroreDesc[ord(App_NoErrore)];
  //Questa funzione, quando viene chiamata attiva il sistema di reportistica tramite DB.
  //Inoltre effettua tutti i controlli e aggiorna automaticamente le tabelle della visione con la nuova struttura ove necessario.
  //Test della presenza del database
  try
    ForceDirectories(ExtractFilePath(sNomeDB));
    //Crea il buffer per gli Step (1 SubPasso solo di lunghezza fissa)
    //(DataOraUTC, Prg, SX, SubPasso, EsitoPasso, TipoControllo, ColoreControllo, "ColoreLimite(intensita)", ScattaFoto, Exp1, Exp2, Exp3, Exp4, Exp5, Exp6, Exp7, Exp8)
    if FDConnection1.Connected then
      begin
        FDConnection1.Close;
      end;
    VersioneDB := '50';
    tempelenco := TStringList.Create;
    //Non serve specificare in realtà la creazione, in quanto se non esiste il database viene creato qualunque modo si imposti.
    if FileExists(sNomeDB) then
      begin
        FDConnection1.Params.Values['OpenMode'] := 'omReadWrite';
      end
    else
      begin
        FDConnection1.Params.Values['OpenMode'] := 'omCreateUTF16';
      end;
    FDConnection1.Params.Database  := sNomeDB;
    FDConnection1.Open;
    //Se siamo arrivati sino a qui, vuole dire che il database comunqueè stato creato.
    //Controlliamo ogni singola tabella della visione
    //*
    //Qui viene creata la tabella Versione. Con la seguente istruzione andiamo a cearla se non esiste:
    FDConnection1.ExecSQL('create table if not exists Versione (Visione varchar(16))');
    //Ora controlliamo se c'è il campo "Visione", se non c'è lo creiamo.
    //Questo è il metodo fornito da SQLITE ('PRAGMA table_info(Versione)') per elencare i campi di una tabella;
    //quello applicato è invece più generico e funziona con tutti i database
    tempelenco.Clear;
    tempflag := false;
    i := 0;
    FDConnection1.GetFieldNames('', '', 'Versione', '', tempelenco);
    while i <  tempelenco.Count do
      begin
        if UpperCase(tempelenco[i]) = 'VISIONE' then
          begin
            tempflag := true;
            break;
          end;
        inc(i);
      end;
    if not tempflag then
      begin
        //Eseguiamo la AlterTable per aggiungere la colonna "Visione";
        FDConnection1.ExecSQL('alter table Versione ADD COLUMN Visione varchar(16)');
      end;
    //Leggiamo il valore della versione, e se differisce allora è necessario modificare il database (o tabelle o campi).
    //Se è Nullo lo aggiorniamo noi.
    FDQuery1.Active := false;
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Add('select Visione from Versione');
    FDQuery1.Active := true;
    FDQuery1.First;
    if FDQuery1.FieldByName('Visione').Value <> NULL then
      begin
        tempstr := FDQuery1.FieldByName('Visione').Value;
      end
    else
      begin
        tempstr := '50'; //per default viene inserito un valore di versione minore alla prima versione con il DB
        FDQuery1.Edit;
        FDQuery1.FieldByName('Visione').Value := tempstr;
        FDQuery1.Post;
      end;
    //Verifichiamo la versione del database (prime due cifre della versione del programma)
    if VersioneDB.ToInteger > tempstr.ToInteger  then
      begin
        //Dobbiamo aggiornare il database, ricreando le tabelle e trasferendo i vecchi dati
        //Vengono aggiornate tutte le tabelle, onde evitare qualsiasi problema
        //La procedura è identica a quella usata dai vari SQLITE Manager
        tempelenco.Clear;
        tempflag := false;
        i := 0;
        FDConnection1.GetTableNames( '', '', '', tempelenco);
        for i := Low(tempDBList) to High(tempDBList) do
          begin
            case tempDBtipo(i) of
              VisSubPassi:
                begin
                  //Per ogni tabella elencata, cerchiamose esiste già nel database
                  if tempelenco.IndexOf(tempDBList[i]) >=0 then
                    begin
                      //Trasferiamo i dati della tabella esistente e creiamo quella nuova, ritrasferendo tutti i dati.
                      FDConnection1.ExecSQL('PRAGMA foreign_keys = 0');
                      FDConnection1.ExecSQL('CREATE TABLE temp_'+tempDBList[i]+' AS SELECT * FROM '+tempDBList[i]);
                      FDConnection1.ExecSQL('DROP TABLE '+tempDBList[i]);
                      //Creiamo la nuova tabella
                      tempstr := 'CREATE TABLE if not exists '+tempDBList[i]+' (DataOraUTC DATETIME NOT NULL, Prg INTEGER NOT NULL, SX BOOLEAN NOT NULL, SubPasso INTEGER NOT NULL, EsitoPasso BOOLEAN NOT NULL, ';
                      tempstr := tempstr + 'TipoControllo varchar(16) NOT NULL, ColoreControllo varchar(16) NOT NULL, ColoreLimiteLow INTEGER NOT NULL, ColoreLimiteHigh INTEGER NOT NULL, ScattaFoto BOOLEAN NOT NULL, Exp1 INTEGER NOT NULL DEFAULT (0), Exp2 INTEGER NOT NULL DEFAULT (0), ';
                      tempstr := tempstr + 'Exp3 INTEGER NOT NULL DEFAULT (0), Exp4 INTEGER NOT NULL DEFAULT (0), Exp5 INTEGER NOT NULL DEFAULT (0), Exp6 INTEGER NOT NULL DEFAULT (0), Exp7 INTEGER NOT NULL DEFAULT (0), Exp8 INTEGER NOT NULL DEFAULT (0))';
                      FDConnection1.ExecSQL(tempstr);
                      //Reinseriamo i dati nella nuova tabella
                      //nei nuovi campi
                      tempstr := 'INSERT INTO '+tempDBList[i]+' (DataOraUTC, Prg, SX, SubPasso, EsitoPasso, TipoControllo, ColoreControllo, "ColoreLimite(intensita)", ScattaFoto, Exp1, Exp2, Exp3, Exp4, Exp5, Exp6, Exp7, Exp8) ';
                      //dai vecchi  campi
                      tempstr := tempstr + 'SELECT DataOraUTC, Prg, SX, SubPasso, EsitoPasso, TipoControllo, ColoreControllo, "ColoreLimite(intensita)", ScattaFoto, Exp1, Exp2, Exp3, Exp4, Exp5, Exp6, Exp7, Exp8 FROM temp_'+tempDBList[i];
                      FDConnection1.ExecSQL(tempstr);
                      //Eliminiamo la vecchia tabella
                      FDConnection1.ExecSQL('DROP TABLE temp_'+tempDBList[i]);
                      //Creiamo gli eventuali indici
                      // 'CREATE UNIQUE INDEX IDX_IndiceSubPasso ON VisSubPassi (DataOraUTCs, Prg, SubPasso);
                      FDConnection1.ExecSQL('PRAGMA foreign_keys = 0');
                    end
                  else
                    begin
                      //Creiamo la nuova tabella
                      tempstr := 'CREATE TABLE if not exists '+tempDBList[i]+' (DataOraUTC DATETIME NOT NULL, Prg INTEGER NOT NULL, SX BOOLEAN NOT NULL, SubPasso INTEGER NOT NULL, EsitoPasso BOOLEAN NOT NULL, ';
                      tempstr := tempstr + 'TipoControllo varchar(16) NOT NULL, ColoreControllo varchar(16) NOT NULL, ColoreLimiteLow INTEGER NOT NULL, ColoreLimiteHigh INTEGER NOT NULL, ScattaFoto BOOLEAN NOT NULL, Exp1 INTEGER NOT NULL DEFAULT (0), Exp2 INTEGER NOT NULL DEFAULT (0), ';
                      tempstr := tempstr + 'Exp3 INTEGER NOT NULL DEFAULT (0), Exp4 INTEGER NOT NULL DEFAULT (0), Exp5 INTEGER NOT NULL DEFAULT (0), Exp6 INTEGER NOT NULL DEFAULT (0), Exp7 INTEGER NOT NULL DEFAULT (0), Exp8 INTEGER NOT NULL DEFAULT (0))';
                      FDConnection1.ExecSQL(tempstr);
                    end;
                end;
              VisVerificaColore:
                begin
                  //Per ogni tabella elencata, cerchiamose esiste già nel database
                  if tempelenco.IndexOf(tempDBList[i]) >=0 then
                    begin
                      //Trasferiamo i dati della tabella esistente e creiamo quella nuova, ritrasferendo tutti i dati.
                      FDConnection1.ExecSQL('PRAGMA foreign_keys = 0');
                      FDConnection1.ExecSQL('CREATE TABLE temp_'+tempDBList[i]+' AS SELECT * FROM '+tempDBList[i]);
                      FDConnection1.ExecSQL('DROP TABLE '+tempDBList[i]);
                      //Creiamo la nuova tabella
                      //tempstr := 'CREATE TABLE if not exists '+tempDBList[i]+' (DataOraUTC DATETIME NOT NULL REFERENCES VisSubPassi (DataOraUTC), Prg INTEGER NOT NULL REFERENCES VisSubPassi (Prg), SX BOOLEAN NOT NULL REFERENCES VisSubPassi (SX), ';
                      //tempstr := tempstr + 'SubPasso INTEGER NOT NULL REFERENCES VisSubPassi (SubPasso), NumRoi INTEGER NOT NULL, EsitoRoi BOOLEAN NOT NULL, TipoRoi VARCHAR (16) NOT NULL, ';
                      tempstr := 'CREATE TABLE if not exists '+tempDBList[i]+' (DataOraUTC DATETIME NOT NULL, Prg INTEGER NOT NULL, SX BOOLEAN NOT NULL, ';
                      tempstr := tempstr + 'SubPasso INTEGER NOT NULL, NumRoi INTEGER NOT NULL, EsitoRoi BOOLEAN NOT NULL, TipoRoi VARCHAR (16) NOT NULL, ';
                      tempstr := tempstr + 'MinNumPixel INTEGER NOT NULL, MaxNumPixel INTEGER NOT NULL, ConteggioPixel INTEGER NOT NULL)';
                      FDConnection1.ExecSQL(tempstr);
                      //Reinseriamo i dati nella nuova tabella
                      //nei nuovi campi
                      tempstr := 'INSERT INTO '+tempDBList[i]+' (DataOraUTC, Prg, SX, SubPasso, NumRoi, EsitoRoi, TipoRoi, MinNumPixel, MaxNumPixel, ConteggioPixel) ';
                      //dai vecchi  campi
                      tempstr := tempstr + 'SELECT DataOraUTC, Prg, SX, SubPasso, NumRoi, EsitoRoi, TipoRoi, MinNumPixel, MaxNumPixel, ConteggioPixel FROM temp_'+tempDBList[i];
                      FDConnection1.ExecSQL(tempstr);
                      //Eliminiamo la vecchia tabella
                      FDConnection1.ExecSQL('DROP TABLE temp_'+tempDBList[i]);
                      //Creiamo gli eventuali indici
                      // 'CREATE UNIQUE INDEX IDX_IndiceSubPasso ON VisSubPassi (DataOraUTCs, Prg, SubPasso);
                      FDConnection1.ExecSQL('PRAGMA foreign_keys = 0');
                    end
                  else
                    begin
                      //Creiamo la nuova tabella
                      tempstr := 'CREATE TABLE if not exists '+tempDBList[i]+' (DataOraUTC DATETIME NOT NULL, Prg INTEGER NOT NULL, SX BOOLEAN NOT NULL, ';
                      tempstr := tempstr + 'SubPasso INTEGER NOT NULL, NumRoi INTEGER NOT NULL, EsitoRoi BOOLEAN NOT NULL, TipoRoi VARCHAR (16) NOT NULL, ';
                      tempstr := tempstr + 'MinNumPixel INTEGER NOT NULL, MaxNumPixel INTEGER NOT NULL, ConteggioPixel INTEGER NOT NULL)';
                      FDConnection1.ExecSQL(tempstr);
                    end;
                end;

//OMISSIS ............QUI SI CONTINUA CON LE ALTRE TABELLE

            end;
        end;
        //Andiamo ad aggiornare il campo versione se siamo arrivati sino a qui
        FDQuery1.Active := false;
        FDQuery1.SQL.Clear;
        FDQuery1.SQL.Add('select Visione from Versione');
        FDQuery1.Active := true;
        FDQuery1.First;
        FDQuery1.Edit;
        FDQuery1.FieldByName('Visione').Value := VersioneDB;
        FDQuery1.Post;
      end;
    fUsaDBforTrace := true;   //Se tutto OK allora settiamo il flag per l'uso del database.
    except on e:exception do
      begin
        if not trystrtoint(e.ClassName, tempresult) then
          begin
            tempresult := BaseError_SW+$FFFF;
          end;
        Result := tempResult;
        sErrore := '$'+inttohex(tempresult,8)+': '+e.Message;
      end;
  end;
  tempelenco.Free;
end.;

:) Ogni alba è un regalo, ogni tramonto è una conquista :)

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 60
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 68
Total: 68

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.