Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: antoniog - Settembre 19, 2017, 04:21:49 pm

Titolo: errore zeoslib sqlite (RISOLTO)
Inserito da: antoniog - Settembre 19, 2017, 04:21:49 pm

Buongiorno a tutti, qualcuno sa dirmi cosa significa questo messaggio:


Il progetto Gescomp ha sollevato una eccezione di classe 'External: SIGSEGV'.
All'indirizzo 43207F
sto provando ad utilizzare Lazarus 1.6.4x64 e Zeoflib 7.1.4, il progetto ha 3 datamodule con molte Ztable collegate a vari database, es. /listini/1 ,  /listini/12 ecc. - e es. /progetti/1 /progetti/2 + un datamodule di sistema con Zconnection collegato al database nella cartella /Bin.
quindi da programma scelgo, quando occorre, quale progetto e quale listino attivare. sul listino nessun problema, cambio database senza alcun errore mentre sul progetto questa istruzione: DataProge.ZConproge.Connected:=False; crea un'eccezione di access violation, le istruzioni sono identiche su tutti i moduli, cosi come quelle per l'apertura e la chiusura dei database ma l'errore lo da solo uno:progetti. stò impazzendo.Grazie in anticipo dell'aiuto.
Titolo: Re:errore zeoslib sqlite
Inserito da: antoniog - Settembre 19, 2017, 07:11:14 pm
l'errore che mi da adesso è questo:

Operation cannot be performed on an inactive dataset.


Press OK to ignore and risk data corruption.
Press Cancel to kill the program.
se premo ok tutto funziona correttamente
se premo annulla mi da questo errore:

Error : EAccessViolation
Access violation
e il programma si pianta

Titolo: Re:errore zeoslib sqlite
Inserito da: Stilgar - Settembre 20, 2017, 03:58:49 pm
Ciao Antonio.
Chiudi anche tutti i dataset o ne lasci qualcuno aperto?
Non è che stai provando a scorrere il cursore di un dataset mai aperto?

In debug quando si incasta tutto?

Stilgar
Titolo: Re:errore zeoslib sqlite
Inserito da: antoniog - Settembre 21, 2017, 03:57:18 am
Ciao Stilgar,
per tutti e tre i dataset le istruzioni solo simili:

procedure TGescompF.SpeedButton36Click(Sender: TObject);
var
mperco : string;
F : Textfile;
Codice, Path, nome, modi,maschL, maschG, C : String;
begin
    try
     {$IFDEF LINUX}
        mperco:= Application.Location+'Progetti/'+DataSistema.ProgettiCod.Text+'/progetto.sdb';
     {$ENDIF$}
     {$IFDEF WINDOWS}
        mperco:= Application.Location+'Progetti\'+DataSistema.ProgettiCod.Text+'\progetto.sdb';
     {$ENDIF$}
     if  DataSistema.ProgettiPerco.Text <> mperco then        //***********
       begin
         DataSistema.Progetti.Edit;
         DataSistema.ProgettiPerco.Text:=mperco;
         DataSistema.Progetti.Post;
         //informa('progetti post');
       end;
            DataProge.ZConproge.Connected:=False;   //informa('2');
           DataProge.ZConproge.Database:=mPerco; //   informa('3');
           DataProge.ZConproge.Connected:=True;
         ApriTabProge;
         nome := DataSistema.Progetticod.text;
     GetDir(0, C);
         AssignFile(F,'Progetto.mem');
         Rewrite(F);
         Writeln(F, nome);
         Writeln(F, mperco);
         CloseFile(F);
     ShowMessage('Progetto attivato')
     except
          on E: Exception do
          ShowMessage( 'Error : '+ E.ClassName + #13#10 + E.Message );
          on E:EDatabaseError do
          Avverti('Si è verificato il seguente errore'#13#10+ E.Message+ #13+
             'è necessario riconvertire gli archivi'#13#10+
             'se l''errore persiste contattare il fornitore '+
             'del programma!!!!')
          else
          Avverti('Errore');


       end;
end;


procedure ApritabProge;
 var
 I  : integer;
 TTempZ : TZTable;
 begin
 //informa('Apri Tabproge');
   with DataProge do
     begin
      try
       I:= 0;
       while I < (ComponentCount) do
         begin
           if Components is TZTable then
             begin
               TTempz:= Components as TZTable;
               //Informa('TabProge   :'+TTempz.Name);
               TTempZ.Active:=False;
               TTempZ.Active:=True;
             end;
           I:= I+1;
         end;
 except
    on E:EDatabaseError do
          Avverti('In :'+TTempz.Name+ '  si è verificato il seguente errore'#13#10+ E.Message+ #13+
             'è necessario riconvertire gli archivi'#13#10+
             'se l''errore persiste contattare il fornitore '+
             'del programma!!!!')
 end;
    end;
end;
da l'errore solo qui:

DataProge.ZConproge.Connected:=False;
e poi naturalmente se si prosegue da altri errori
Titolo: Re:errore zeoslib sqlite
Inserito da: antoniog - Settembre 29, 2017, 11:15:09 pm
dopo vari tentativi ho il fondato sospetto che rendendo il database shared si possa risolvere il problema, come rendere condiviso un database sqlite?
Titolo: Re:errore zeoslib sqlite (RISOLTO)
Inserito da: antoniog - Ottobre 01, 2017, 01:11:18 am
Credo di avere trovato il problema , ho messo nello stesso datamodule diverse ZTable con la stessa -tablename- perchè mi serviva avere nella stessa finestra vari dati della stessa tabella ma filtrati in modo diverso. Tutte queste ZTable erano collegate allo stesso ZConnection e questo determinava l'errore di "access violation"  a volte per: "Dataset is Locked" altre volte con altri messaggi. Verificato che i database SQLite sono shared  ho provato a fare un altro Datamodule dove ho messo le ZTable doppie con filtri diversi collegate ad un atro ZConnenction e in questo modo funziona e non da più errori. Qundi a questo punto penso di avere risolto il problema per cui metto "risolto".
Titolo: Re:errore zeoslib sqlite (RISOLTO)
Inserito da: xinyiman - Ottobre 01, 2017, 08:46:31 am
Molto bene, ricordate solo una cosa. Quando avete bisogno d'aiuto sarebbe bene che allegaste un piccolo esempio che replica il problema. Così si riesce a circoscrivere lo stesso con tempistiche più ridotte.
Titolo: Re:errore zeoslib sqlite (RISOLTO)
Inserito da: antoniog - Ottobre 01, 2017, 10:57:58 pm
questa innocente istruzione provocava l'errore di "access violation" : Datamodule1.ZConnection1.Connected:=False;
Titolo: Re:errore zeoslib sqlite (RISOLTO)
Inserito da: antoniog - Ottobre 07, 2017, 03:17:01 am

L'avere risolto con un sotterfugio l'errore mi lasciava perplesso e non mi convinceva ad andare avanti, perchè togliendo la connessione a ZConnection con False in Connected, con conseguente disattivazione di tutte le ZTable nel Datamodule, generasse un errore di "Access violation" e a volte proseguendo di "Operation cannot be performed on an inactive dataset"?
per cui ho continuato col debug e con la ricerca dell'arcano. Alla fine ho trovato questa istruzione che poteva essere la causa del secondo messaggio di errore
Codice: [Seleziona]
  
procedure TGescompF.DBEdit100Change(Sender: TObject);
begin
     DataProge.Progetto.Edit;
     DataProge.ProgettoImprevisti.Value:=
     (DataProge.ProgettoTOT_PROG.Value-DataProge.ProgettoTOTALE2.Value);
     DataProge.ProgettoTOTLETTERE.Value:= NumLettere(DataProge.ProgettoTOT_PROG.Value);
end;
ho provato a sostituirla con la seguente
Codice: [Seleziona]
procedure TGescompF.DBEdit100Change(Sender: TObject);
begin
 if  DataProge.Progetto.Active then
   begin
     DataProge.Progetto.Edit;
     DataProge.ProgettoImprevisti.Value:=
     (DataProge.ProgettoTOT_PROG.Value-DataProge.ProgettoTOTALE2.Value);
     DataProge.ProgettoTOTLETTERE.Value:= NumLettere(DataProge.ProgettoTOT_PROG.Value);
   end;
end;   
e tutto si è risolto, con l'istruzione OnChange andavo a scrivere su una tabella che non era attiva!
Effettuata la modifica il cambio degli archivi a runtime funziona perfettamente ma ho perso quasi un mese nella ricerca dell'errore.