لماذا أحيانا أحصل على استثناء "غير صالح معاملة الكائن"؟
سؤال
هل هناك شيء خاطئ مع هذا الرمز منتديات أحيانا أحصل على استثناء "كائن المعاملة غير صالح" غير معالج فيه:
procedure BlaBla;
var
TD: TDBXTransaction;
begin
TD := SQLConnection.BeginTransaction;
try
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.CommitFreeAndNil(TD);
except
SQLConnection.RollbackFreeAndNil(TD);
end;
end;
ويتم رفع هذا الاستثناء للمستخدم، لذلك أفترض انها رفعت من قبل RollbackFreeAndNil، لأن كل الباقي داخل try..except.
وأود أن التفاف RollbackFreeAndNil مع try..except آخر؟ ما هذه الفوضى.
وأنا باستخدام دلفي 2009، DBX مع فايربيرد 2.1 و سائق Devart ل.
المحلول 2
والمشكلة هي أن SQLConnection.BeginTransaction يعود لا شيء إذا لم يتم توصيل SQLConnection إلى قاعدة البيانات. ثم أحصل على استثناء من وجوه المعاملات غير صالح.
لم أكن أتوقع ذلك. يجب أن محاولة الاتصال أو رفع استثناء. العودة شيء لا معنى له بالنسبة لي.
نصائح أخرى
وماذا سيحدث لو رمى CommitFreeAndNil استثناء؟
وسيطلق عليها RollbackFreeAndNil. هل TD تكون صالحة بعد ذلك؟
وأنت تناول استثناء، وبالتالي الأدلة. لا تفعل ذلك. إعادة رمي:
procedure BlaBla;
var
TD: TDBXTransaction;
begin
TD := SQLConnection.BeginTransaction;
try
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.ExecuteDirect('some sql command');
except
SQLConnection.RollbackFreeAndNil(TD);
raise;
end;
SQLConnection.CommitFreeAndNil(TD);
end;
في بعض الأحيان هو أن تقوم بتنفيذ إجراءات فريوس] مع عنصر مثل cxdbmemo وتعطيك أن يكون خطأ. لديك لإزالة هذا العنصر (أو سومثينغ مثل هذا) والقيام معاملتك وضعها الطبيعي.
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);