لماذا أحيانا أحصل على استثناء "غير صالح معاملة الكائن"؟

StackOverflow https://stackoverflow.com/questions/420022

  •  05-07-2019
  •  | 
  •  

سؤال

هل هناك شيء خاطئ مع هذا الرمز منتديات أحيانا أحصل على استثناء "كائن المعاملة غير صالح" غير معالج فيه:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top