2013-01-10 24 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; 

查詢通過driver = Sqlite鏈接到SQLConnection。所有的操作都能正常工作,但是當我嘗試在具有唯一索引的列中插入一個非唯一值時,我會遇到值存在的例外情況。好的,我的代碼捕獲它並顯示一條消息「列標題不是唯一的」,但在調試器向我顯示TWICE異常之前。當我關閉程序,存儲器管理器講述內存泄漏,並且泄漏是:當插入sqlite時發生錯誤時,Delphi XE3中的內存泄露db

  • 21 - 28字節:的UnicodeString×4
  • 61 - 68個字節:TDBXSqliteCommand X2
  • 69 - 76個字節:TDBXMorphicCommand ×2
  • 221 - 236字節:未知×2

是否有可能避免?

UPD:我用FastMM4得到詳細的日誌,以下是關於一個內存泄漏部分:

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

我們可以假設,當一個獨特的價值發佈時,沒有泄漏? –

+1

當你在調試器外部運行程序時,你有泄漏嗎?調試代碼時,我總是有UnicodeString泄漏... – whosrdaddy

+0

內存管理器是否也告訴你*哪些泄漏的東西被分配? –

回答

3

我運行dbXpress SQLite的MySQL的驅動程序(XE3)的測試和代碼只是用SQLite泄漏(在調試模式下也會出現雙重異常),但它不會與MySQL一起使用

恕我直言,這是一個應該向QC報告的錯誤。

堆棧跟蹤首先發生異常調試器

: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) 

堆棧跟蹤第二個例外發生在調試

: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) 

而導致內存泄漏...

+0

謝謝。實際上,我明白了最後的嘗試......但是,我給出了一個代碼來顯示執行ExecSQL時出現的錯誤,只有在數據庫錯誤的情況下(在我的情況下,這個錯誤是唯一索引中的重複值)。爲了準確,TSQLQuery是DataModule中的一個組件,但是,重複一次,如果數據庫響應沒有錯誤,則不會發生內存泄漏。 – BitLord

+0

@BitLord我已經更新了我的答案:o) –

+0

哇!感謝您的研究。據我瞭解,我對DBX內部錯誤代碼的假設是正確的,不是嗎? :)。而且,不幸的是,我不可能向QC報告錯誤。 – BitLord