Autor Téma: FireDAC DLL Sharing sample a SQLite  (Přečteno 145 krát)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 554
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
FireDAC DLL Sharing sample a SQLite
« kdy: 16-01-2020, 23:44:02 »
Mám problém s FireDAC DLL Sharing sample.
Ide o oficiálne Delphi demo pre klon FDConnection do DLL-ka.
Je na disku: "Pascal\Database\FireDAC\Samples\Comp Layer\TFDConnection\DLL_Sharing"
Docwiki: http://docwiki.embarcadero.com/CodeExamples/Rio/en/FireDAC.DLLSharing_Sample
Demo je na báze MS Access. Samozrejme funguje.
Ak však použijem databázu SQLite, tak ten istý program pri zavretí hlavného okna skončí chybou:
"Project Project1.exe raised exception class EFException with message '[FireDAC][Phys]-334. FDPhysManager shutdown timeout. Possible reason: application has not released all connection interfaces."
Zdá sa, že druhá Connection, tá "klonovaná" v DLL-ku pošahá nastavenia hlavnej Connection.
Klonovanie pre DLL sa deje cez parameter ACliHandle (Pointer).
V DLL musí byť samostatná FDConnection, ktorá prevezme pointer do SharedCliHandle.
Connection v DLL-ku sa však nedá "bezbolestne" odpojiť.
Platí pre SQLite. Acces nemá problém.

Potrebujem do databázy v hlavnom programe importovať externé data.
Pre bežnú databázu (na disku), by som mohol použiť samostatnú Connection, lenže nie pre InMemory databázu. Tam je nutný ten klon, popísaný vyššie.
PS
Mám Delphi Tokyo.
PS2
Nečakám zázraky, zdá sa, že SQLite databázu tu používa málokto. No ale za pokus nič nedám..

Offline miroB

  • Guru
  • *****
  • Příspěvků: 554
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:FireDAC DLL Sharing sample a SQLite
« Odpověď #1 kdy: 17-01-2020, 13:41:32 »
Pre istotu som dotaz zavesil vnoci aj na SO.  Niežeby niekto odpovedal, ale nad ránom, ma napadlo riešenie:
CloneConnection.
Funguje.
Kód je okomentovaný. Kód DLL programu zostal bezo zemny.
Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.   private  
  4.     ..
  5.     conn       : TFDCustomConnection; // New
  6.   end;
  7.  
  8. procedure TForm1.Button3Click(Sender: TObject);
  9. begin
  10.   FpShowData( conn.CliHandle ); // orig: FpShowData( FDConnection1.CliHandle );
  11. end;
  12.  
  13. procedure TForm1.FormCreate(Sender: TObject);
  14. begin
  15.   conn  := FDConnection1.CloneConnection; // New
  16. end;
  17.  
  18. procedure TForm1.Button2Click(Sender: TObject);
  19. begin
  20.   FpShutdown();
  21.   conn.Free; // New
  22.   FreeLibrary(FhDll);
  23.   FhDll := 0;
  24.   @FpShowData := nil;
  25.   @FpShutdown := nil;
  26. end;