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

क्वेरी में SQLDonnection से क्वेरी को सॉफ़्टवेयर = स्क्लाइट के साथ जोड़ा जाता है। सभी ऑपरेशन काम करते हैं, लेकिन जब मैं अद्वितीय इंडेक्स के साथ कॉलम में एक गैर-अद्वितीय मान डालने का प्रयास करता हूं, तो मुझे मूल्य अस्तित्व के बारे में अपवाद मिलता है। ठीक है, मेरा कोड इसे पकड़ता है और एक संदेश दिखाता है 'कॉलम शीर्षक अद्वितीय नहीं है', लेकिन डीबगर से पहले मुझे उस अपवाद को दिखाता है TWICE। जब मैं कार्यक्रम बंद करते हैं, स्मृति प्रबंधक मेमोरी लीक के बारे में बताता है, और लीक कर रहे हैं:डेल्फी एक्सई 3 में मेमोरी रिसाव जब एसक्लाइट डीबी

  • 21 - 28 बाइट्स: UnicodeString एक्स 4
  • 61 - 68 बाइट्स: TDBXSqliteCommand x2
  • 69 - 76 बाइट्स: TDBXMorphicCommand एक्स 2
  • 221 - 236 बाइट्स: अज्ञात x 2

कि से बचने के लिए यह संभव है?

युपीडी: मैं विस्तृत लॉग पाने के लिए 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

क्या आप डीबगर के बाहर प्रोग्राम चलाते समय रिसाव रखते हैं? कोड को डीबग करते समय मेरे पास हमेशा यूनिकोडस्ट्रिंग लीक होता है ... – whosrdaddy

+0

क्या स्मृति प्रबंधक आपको यह भी नहीं बताता है कि * उन * लीक की गई चीज़ों को आवंटित किया गया था? –

उत्तर

3

मैं dbXpress SQLite और MySQL ड्राइवर (XE3) के साथ परीक्षण चलाने के लिए और अपने कोड बस SQLite के साथ लीक (डीबग मोड में डबल अपवाद भी प्राप्त करें) लेकिन यह MySQL के साथ नहीं है।

आईएमएचओ यह एक बग है जिसे क्यूसी को सूचित किया जाना चाहिए।

स्टैक ट्रेस पहले अपवाद घटना डिबगर

: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 डेटा मॉड्यूल के अंदर एक घटक है, लेकिन, दोहराएं, यदि डेटाबेस responce में कोई त्रुटि नहीं है, तो मुझे कोई मेमोरी लीक नहीं मिलती है। – BitLord

+0

@ बिटलोर्ड मैंने अपना जवाब अपडेट किया है: ओ) –

+0

वाह! इस शोध के लिए धन्यवाद। जैसा कि मैं समझता हूं कि डीबीएक्स के अंदर बग्गी कोड के बारे में मेरी धारणा सही थी, है ना? :)। और, दुर्भाग्य से, मुझे क्यूसी में बग के बारे में रिपोर्ट करने की कोई संभावना नहीं है। – BitLord