Newsgroup: it.comp.lang.delphi
Titolo: DBExpressPlus e tabelle Temporary di MySQL

Qualcuno usa le DBExpressPlus? Le sto provando con un database MySQL per 
l'utilizzo di tabelle Temporary all'interno di una query.
Se i componenti TSQLConnectionPlus e TSQLQueryPlus li dispongo in un 
DataModule separato e con tutte le proprietà impostate per bene funziona 
tutto, invece se i componenti li creo a runtime all'interno del costruttore 
Create di una classe creata a doc, nel momento di eseguire la query questa 
mi crea un'altra connessione, nel senso che nell'elenco dei thread id delle 
connesioni mysql ottenuto con il comando "SHOW PROCESSLIST" mi ritrovo un id 
in più e diverso da quello usato per creare la tabella temporary.
Le tabelle temporary di MySQL sono visibili solo all'interno della 
connessione che le ha create, e quindi la query non trova la tabella perchè 
sta lavorando su una connessione diversa. Ma perchè sta lavorando su una 
connessione diversa?
Premetto che prima di eseguire la query la connessione è già aperta e il 
parametro KeepConnection è True.
Spero di essere stato chiaro e grazie a chiunque voglia rispondere.
Roberto 

posta il codice del costruttore
-- 
Alberto Salvati
A NEAPOLITAN Delphi Developer who is studying c# and .net
"Dicette 'o pappece 'nfaccia 'a noce dammi 'o tiempo che pure te spertoso"

 posta il codice del costruttore
Come dicevo nel precedente post il mio problema è che creo una tabella 
Temporary e poi eseguo una query di selezione su una tabella del database in 
join con la tabella temporanea, ma dato che la query di selezione avviene 
inspiegabilmente su una connessione diversa da quella già aperta la tabella 
temporary non viene trovata.
Questa è la classe di base
  TGenAccount = class(TComponent)
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  private
    fLogFile: Boolean;
    procedure SetLogFile(const Value: Boolean);
    function  GetConnesso: Boolean;
    function  GetDatabase: String;
    function  GetHostName: String;
    function  GetPassword: String;
    function  GetUserID: String;
  protected
    TheConn: TSQLConnectionPlus;
    TheExecQuery: TSQLQueryPlus;
    TheDtsProv: TDataSetProvider;
    procedure FileLog(const TheMessage: String);
    procedure SetConn(const Value: TSQLConnectionPlus); virtual;
    procedure SetConnesso(const Value: Boolean); virtual;
    procedure VerificaConn;
  public
    property  HostName: String read GetHostName;
    property  Database: String read GetDatabase;
    property  UserID: String read GetUserID;
    property  Password: String read GetPassword;
    procedure ApriDataset(const SQLQuery: String; TheQry: TClientDataSet);
    procedure EseguiSQL(const SQLQuery: String);
  published
    property  LogFile: Boolean read fLogFile write SetLogFile;
    property  Connesso: Boolean read GetConnesso write SetConnesso;
    //La connessione gliela passo esterna attraverso un oggetto 
TSQLConnectionPlus
    //Contenuto in un DataModule condiviso da tutta l'applicazione e già 
connesso
    property  Connessione: TSQLConnectionPlus read TheConn write SetConn;
  end;
Questo il costruttore...
constructor TGenAccount.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  TheExecQuery := TSQLQueryPlus.Create(AOwner);
  TheDtsProv := TDataSetProvider.Create(AOwner);
  TheDtsProv.DataSet := TheExecQuery;
end;
e qui passo la connessione presente in un datamodule condiviso da tutta 
l'applicazione...
procedure TGenAccount.SetConn(const Value: TSQLConnectionPlus);
begin
  TheConn := Value;
  TheExecQuery.SQLConnectionPlus := Value;
end;
e qui è dove mi da l'errore.
Gli passo un CDS posizionato sulla form di riferimento...
procedure TGenAccount.ApriDataset(const SQLQuery: String; TheQry: 
TClientDataSet);
begin
  VerificaConn;
  if not Assigned(TheQry) then
    raise ErrGenAccount.Create('Oggetto query non istanziato.');
  with TheExecQuery do
  begin
    if Active then
      Close;
    SQL.Text := SQLQuery;
  end;
  if TheQry.Active then
    TheQry.Close;
  TheQry.SetProvider(TheDtsProv);
  TheQry.Open;
end;
Se guardo i Thread id di  mysql a questo punto quando apro il clientdataset 
mi crea un thread diverso da quella già esistente, e non trova la tabella 
temporary.
Grazie
Roberto

A chiunque interessasse:
Per il momento ho aggirato il problema tornando ad usare le DBExpress 
standard. Peccato, perchè le Plus hanno un sacco di strumentini proprio 
utili...
Ciao
Roberto