2013-01-10 5 views
6
... 
Query: TSQLQuery 
... 
    Query.SQL.Clear; 
    Query.SQL.Add('INSERT INTO pumps'#13#10 + 
         'VALUES (NULL, :title, :power)'); 
    Query.ParamByName('title').AsString:= title; 
    Query.ParamByName('power').AsFloat:= power; 
    try 
     Query.ExecSQL; 
    except 
     on E: Exception do 
     begin 
      ShowMessage(E.Message); 
     end; 
    end; 

Query è legata alla SQLConnection con conducente = Sqlite. Tutte le operazioni funzionano, ma quando provo a inserire un valore non univoco nella colonna con indice univoco, ottengo un'eccezione sull'esistenza del valore. OK, il mio codice lo cattura e mostra un messaggio 'il titolo della colonna non è univoco', ma prima che il debugger mi mostri quell'eccezione DUE VOLTE. Quando chiudo programma, gestore di memoria parla perdite di memoria, e che le perdite sono:Perdita di memoria in Delphi XE3 quando errore si verifica sull'inserimento in db sqlite

  • 21 - 28 byte: UnicodeString x 4
  • 61 - 68 byte: TDBXSqliteCommand x2
  • 69 - 76 byte: TDBXMorphicCommand x 2
  • 221 - 236 byte: Unknown x 2

E 'possibile evitare che?

UPD: ho usato FastMM4 per ottenere registro dettagliato, e sotto è una parte su perdita di un ricordo:

A memory block has been leaked. The size is: 68 

This block was allocated by thread 0xB18, and the stack trace (return addresses) at the time was: 
4068A6 [System.pas][System][@GetMem$qqri][4203] 
4082BB [System.pas][System][TObject.NewInstance$qqrv][14969] 
4089D2 [System.pas][System][@ClassCreate$qqrpvzc][16231] 
7D5A91 [Data.DbxSqlite.pas][Data.DbxSqlite][Dbxsqlite.TDBXSqliteCommand.$bctr$qqrp26Data.Dbxcommon.TDBXContextp35Data.Dbxsqlite.TDBXSqliteConnection][567] 
6E3DFE [Data.DBXCommon][Generics.Collections.%TDictionary__2$20System.UnicodeStringp32Data.Dbxcommon.TDBXCreateCommand%.GetBucketIndex$qqrx20System.UnicodeStringi] 
7D4C8E [Data.DbxSqlite.pas][Data.DbxSqlite][Dbxsqlite.TDBXSqliteDriver.CreateSqliteCommand$qqrp26Data.Dbxcommon.TDBXContextp29Data.Dbxcommon.TDBXConnectionp26Data.Dbxcommon.TDBXCommand][295] 
6CE4DA [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXDriver.CreateMorphCommand$qqrp26Data.Dbxcommon.TDBXContextp29Data.Dbxcommon.TDBXConnectionp26Data.Dbxcommon.TDBXCommand][7569] 
6D5177 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXDelegateDriver.CreateMorphCommand$qqrp26Data.Dbxcommon.TDBXContextp29Data.Dbxcommon.TDBXConnectionp26Data.Dbxcommon.TDBXCommand][11061] 
6D09F4 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXConnection.CreateMorphCommand$qqrp26Data.Dbxcommon.TDBXCommand][8480] 
6D1C21 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXMorphicCommand.DerivedOpen$qqrv][9084] 
6D1974 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXCommand.Open$qqrv][8962] 

The block is currently used for an object of class: TDBXSqliteCommand 
+2

Possiamo supporre che quando un valore unico viene pubblicato non ci siano perdite? –

+1

Avete la perdita quando si esegue il programma all'esterno del debugger? Ho sempre perdite di UnicodeString quando eseguo il debug del codice ... – whosrdaddy

+0

Il gestore della memoria non dice anche * dove * sono state allocate quelle cose trapelate? –

risposta

3

corro test con DBXpress SQLite e MySQL conducente (XE3) e il codice solo perdite con SQLite (anche ottenere la doppia eccezione in modalità di debug) ma è non con MySQL.

IMHO questo è un bug che dovrebbe essere segnalato a QC.

dello stack in prima eccezione occorrenza debugger

:769cc41f KERNELBASE.RaiseException + 0x58 
Data.DBXCommon.TDBXContext.Error(???,'column title is not unique') 
Data.DbxSqlite.CheckError(19,???,$2F12738) 
Data.DbxSqlite.TDBXSqliteCommand.DerivedExecuteQuery 
Data.DBXCommon.TDBXCommand.ExecuteQuery 
Data.DBXCommon.TDBXMorphicCommand.ExecuteQuery 
Data.SqlExpr.TCustomSQLDataSet.ExecuteStatement 
Data.SqlExpr.TCustomSQLDataSet.ExecSQL(???) 
Data.SqlExpr.TSQLQuery.ExecSQL(???) 
Main_ViewU.TForm1.RunQuery($2E7B870,'Title',10) 
Main_ViewU.TForm1.Button1Click($2E85AD0) 

dello stack in seconda eccezione occorrenza debugger

:769cc41f KERNELBASE.RaiseException + 0x58 // <-- Exception interrupts Destroy 
Data.DBXCommon.TDBXContext.Error(???,'column title is not unique') 
Data.DbxSqlite.CheckError(19,???,$2F12738) 
Data.DbxSqlite.TDBXSqliteCommand.DerivedClose 
Data.DBXCommon.TDBXCommand.Close 
Data.DBXCommon.TDBXMorphicCommand.DerivedClose 
Data.DBXCommon.TDBXCommand.Close 
Data.DBXCommon.TDBXCommand.Destroy   // <-- DESTROY 
Data.DBXCommon.TDBXMorphicCommand.Destroy  // <-- DESTROY 
System.TObject.Free 
Data.SqlExpr.TCustomSQLDataSet.CloseStatement 
Data.SqlExpr.TCustomSQLDataSet.InternalFreeCommand 
Data.SqlExpr.TCustomSQLDataSet.FreeCommand 
Data.SqlExpr.TCustomSQLDataSet.ExecSQL(???) 
Data.SqlExpr.TSQLQuery.ExecSQL(???) 
Main_ViewU.TForm1.RunQuery($2E7B870,'Title',10) 
Main_ViewU.TForm1.Button1Click($2E85AD0) 

E questo fa sì che la perdita di memoria ...

+0

Grazie. In realtà, capisco di provare ... finalmente, ma ho dato un codice per mostrare che l'errore appare esattamente durante l'esecuzione di ExecSQL, e solo in caso di errore del database (nella mia situazione questo errore è valore duplicato su indice univoco).Per essere precisi, TSQLQuery è un componente all'interno di DataModule, ma, ripeto, se la risposta del database non ha errori, non ho perdite di memoria. – BitLord

+0

@BitLord Ho aggiornato la mia risposta: o) –

+0

Wow! Grazie per questa ricerca. Come ho capito la mia ipotesi sul codice buggy all'interno di DBX era giusta, non è vero? :). E, sfortunatamente, non ho alcuna possibilità di riportare bug al CQ. – BitLord

Problemi correlati