Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: AlexM - Febbraio 06, 2022, 06:45:42 pm

Titolo: Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: AlexM - Febbraio 06, 2022, 06:45:42 pm
Ciao a tutti

Come ho scritto nel forum di presentazione sono un ex utilizzatore Delphi e sto facendo qualche prova per un nuovo progetto che dovrò portare avanti. Mi sto trovando decisamente bene, ma ho qualche piccolo problema per cui chiedo cortesemente il vostro supporto:
- L’oggetto TTable non esiste in lazarus? Per un rapido accesso ad una tabella è comunque necessario usare un oggetto SQL? Come lettura non è un grosso problema, invece di selezionare la tabella scrivo una piccola query, ma pur avendo attivato l’autoupdate e l’autocommit le insert non si scrivono nel db, e soprattutto le update vanno sempre in errore….
- Ho installato la versione 64bit sia di Lazarus che di MySql, copiato la libreria libmysql.dll in system32 e la connessione funziona correttamente, ma quando accendo e spengo l’oggetto TSQL ricevo un errore di “access violation”, solo nell’IDE per fortuna, non quando mando l’eseguibile in Run. Da cosa è causato?
- Ogni tanto vedo comportamenti strani dell’IDE: oggetti che sfarfallano quando muovo il mouse, cambiano di posizione e di dimensioni apparentemente da soli, ecc… sbaglio qualcosa?

Grazie in anticipo!

Alex
Titolo: Re:Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: DragoRosso - Febbraio 06, 2022, 07:07:42 pm
Prova ad usare "ZEOS dbo". Lo trovi nei menu "Pacchetto" -> Online Packet Manager.

E' in pratica il FireDac della situazione, si usa esattamente come usavi i componenti SQL in Delphi.

Se cerchi nel forum (tramite la ricerca) parole come database, zeos, sql, troverai dei post (guarda gli ultimi) in cui ci sono anche dei progetti demo).

Però sono abbastanza sicuro che quando scaricherai ZEOS riuscirai immediatamente ad usarlo.
Quando sceglierai di installarlo da On Line (ma anche se installassi pacchetti non online), ti verrà chiesto di RICOMPILARE LAZARUS.
Accetta. Rispetto a Delphi, dove i componenti aggiuntivi non modificavano l'IDE, in Lazarus devi ricompilare l'IDE.

EDIT: Ti posto un demo db (vedi com'è che lo usavo per le prove) e usa SQLite, lo puoi adattare a MySQL....

Ciao
Titolo: Re:Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: nomorelogic - Febbraio 06, 2022, 07:12:26 pm
- Ho installato la versione 64bit sia di Lazarus che di MySql, copiato la libreria libmysql.dll in system32 e la connessione funziona correttamente, ma quando accendo e spengo l’oggetto TSQL ricevo un errore di “access violation”, solo nell’IDE per fortuna, non quando mando l’eseguibile in Run. Da cosa è causato?

Ciao Alex e benvenuto
per questo problema, prova a copiare le dll anche nella cartella dove c'è Lazarus.exe, in questo modo dovrebbe funzionare anche l'IDE.
Titolo: Re:Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: bonmario - Febbraio 06, 2022, 07:56:49 pm
Ciao,
non ho mai utilizzato Delphi, cosa sarebbe l'oggetto TTable?

Per provare comunque a rispondere alle tue domande, io  lavoro sui DB senza usare componenti esterni, e faccio tutto con gli oggetti messi a disposizione "nativamente" da Lazarus, e fino ad ora non sento la mancanza di altro !!!
Normalmente uso questi 4 oggetti per connettermi ai DB:
Codice: [Seleziona]
    DBGrid1: TDBGrid;
    SQLConnector1: TSQLConnector;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;

Attualmente ho un solo progetto in cui devo scrivere sul DB. Le varie scritture/cancellazioni, vengono fatte tramite l'oggetto DBNavigator.
In testa ho questo:
Codice: [Seleziona]
        //Per poter modificare i record tramite DBNavigator1, ho bisogno delle seguenti opzioni:
        SQLQuery1.ReadOnly:=False;
        SQLQuery1.UsePrimaryKeyAsKey:=True;
        SQLQuery1.PacketRecords:=-1; //https://wiki.freepascal.org/mssqlconn#Error_20019_:_Attempt_to_initiate_a_new_Adaptive_Server_operation_with_results_pending
        SQLQuery1.UpdateMode:=upWhereChanged;

Scritto prima di fare la
Codice: [Seleziona]
SQLQuery1.Open;

La scrittura vera e propria, viene fatta tramite la proprietà "AfterPost" dell'oggetto TSqlQuery.

Qui il codice che uso:
Codice: [Seleziona]
procedure TForm1.SQLQuery1AfterPost(DataSet: TDataSet);
begin
  //Usata quando (TipoApertDB = tadScrivi)
  try
    SQLQuery1.ApplyUpdates;
    if (1 = 2) then begin
      SQLTransaction1.Commit; //A differenza di CommitRetaining, chiude la conenssione subito dopo aver committato
      GestVislTabella(Self);  //Visto quanto scritto qui sopra, ricarico la tabella
    end else begin
      SQLTransaction1.CommitRetaining; //Fa la commit, e tiene attiva la connessione
    end;
  except
    on E: Exception do begin
      EmettiErrore(0, 'ERRORE: ' +
                      LineEnding +
                      E.Message);
      //Ricarico i dati della tabella.
      //Se non lo facessi, l'utente vedrebbe in griglia anche i valori che non sono stati salvati !!!
      GestVislTabella(Self);
    end;
  end;
end;


Ciao, Mario
Titolo: Re:Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: AlexM - Febbraio 06, 2022, 08:33:19 pm
grazie a tutti per le risposte!
L'oggetto TTable consentiva in maniera molto semplice di accedere a una tabella selezionando praticamente solo la connection ed il nome della tabella, e collegandolo poi ai vari oggetti tipo grid, navigator, ecc. le insert/update/delete erano già funzionanti senza nessun codice. Praticamente l'oggetto SQL serviva solo quando sulla tabella dovevano essere effettuate delle "where" complesse.
Continuerò a provare secondi i vostri consigli, ma non ho capito se è meglio usare le ZEOSLib (che già usavo in Delphi) oppure i componenti nativi. Preciso che l'"Access violation" mi saltava fuori quando attivavo gli oggetti db access in ide, ma comunque si attivavano correttamente, per questo penso sia un problema risolvibile......
Già una soluzione ai miei dubbi dovrebbe arrivare dal metodo CommitRetaining invece del Commit, anche se in teoria speravo che l'opzione "autocommit" li rendesse superflui

Grazie ancora e ..... ci sentiamo dopo le prossime prove  :)
Titolo: Re:Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: DragoRosso - Febbraio 06, 2022, 09:12:41 pm
Ciao,
non ho mai utilizzato Delphi, cosa sarebbe l'oggetto TTable?

E' un classe che rappresenta una tabella di un database. Con essa, come accennava @AlexM, accedi ad una tabella e puoi facilmente interagire con il DB senza nenache sapere cosa è SQL. In ZEOS l'equivalente è TZTable. Ha i metodi per navigare, inserire, modificare, cancellare, ordinare, filtrare, etc ...

Ciao
Titolo: Re:Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: tito_livio - Febbraio 07, 2022, 01:31:14 am
Ciao,
anche io lavoro con i componenti nativi, in Mysql e anch'io provengo da Delphi.
Per poter salvare devi soltanto:
Preso il campo chiave primaria della tsqlquery, devi settare, per la proprietà ProviderFlags, pfInKey=true, altrimenti non salva.
Per salvare le modifiche fatte:
Codice: [Seleziona]
tsqlquery1.applyupdates;
tmysql57connection1.Transaction.CommitRetaining;
Nell'Ide, anche a me raramente dà access violation all'apertura della query ma poi funziona tutto lo stesso, in esecuzione nessun problema. Ancora non ho capito il perché.
Se poi hai due tabelle in master-detail basta aggiornare la query della tabella detail "on change" del campo chiave della tabella master.
Spero di essere stato chiaro e di aiuto,
buon lavoro.
Titolo: Re:Primi esperimenti con Lazarus... e qualche dubbio
Inserito da: AlexM - Febbraio 07, 2022, 12:47:25 pm
ciao a tutti

ho installato i componenti Zeoslib, e mi sembrano molto più veloci e stabili degli originali.....

ale