easyDelphi Q&A
+2 تصويتات
75 مشاهدات

في دلفي XE7 وبإستعمال TSQLConnection أحاول تنفيذ إستعلامين متتالين (حذف ثم إضافة ) في قاعدة بيانات SQLite

var    TD: TTransactionDesc;
brgin
if CM.SQLCon.InTransaction then
   Exit;
with CM.SQLCon do
  Try
     TD.TransactionID := 1;
     TD.IsolationLevel := xilREADCOMMITTED;
     StartTransaction(TD);// ُخطأ هنا
     if length(FieldTodel)>Length(DelOldRecord) then
        ExecuteDirect(FieldTodel);
     ExecuteDirect(S);
     Commit(TD);
  Except
     Rollback(TD);
     raise
    End;
    End;

 

ا بعد عمل Debug  والتنفيذ خطوة خطوة توصلت إلى مصدر الخطأ والموجود في الإجراء DerivedOpen في الوحدة Data.DBXSqlite

procedure TDBXSqliteCommand.DerivedOpen;
var
  ErrorCode: Integer;
  Dummy: PChar;
begin
  Dummy := nil;
  FDBXContext.Trace(0, trace_sqlite3_prepare16_v2);
  ErrorCode := sqlite3_prepare16_v2(FSqliteConnection.ConnectionHandle, PChar(Text), Text.Length * SizeOf(Char), FStatementHandle, Dummy);
  // هنا ErrorCode <> 0
  CheckError(ErrorCode, FSqliteConnection.ConnectionHandle, FDBXContext);
end;

 

 

 

 

سُئل في تصنيف Database بواسطة (7,480 نقاط)
عُدل بواسطة | 75 مشاهدات
 
هل توجد رسالة خطأ واضحة أم خطأ رسالة خطأ ذاكرة .. ام لا توجد رسالة نهائيا . وكان الترانسأكشن لا يبدأ ؟؟
لا هناك إثارة ل Exception عند تنفيذ StartTransaction
ضع رسالة الخطأ بالكامل، و ضع محتوى ال SQL بالكامل
نعم الموضوع كان يبدو على حسب رسالة الخطأ المذكورة في السؤال أنه متعلق بال Transaction أو إستعلام SQL  المستعمل، لكن في الحقيقة أنني كنت أستخدم نسخة قديمة من SQLite (أجريت بعض التجارب ونسيت أن أثبت النسخة الأخيرة)، لكن المسألة حلت بإعادة آخر إصدار SQLite.
 رسالة الخطأ هي near "SAVEPOINT": Syntax Error.
محتوى SQL
'("FieldToDelete:='DELETE FROM OPTIONS WHERE OptionsName in ("Option1","Option2
'  (" S:='INSERT INTO Options(OptionName) VALUES ("Option1") VALUES("Option2
ممتاز. السؤال فعلا كان محيير.
يمكن الاصدار  هو السبب ان المشكلة لم تظهر عندي ولم استطع الاجابة.
اذا سمحت. اضف رسالة الخطأ للسؤال. واجب عليه ان المشكلة في عدم توافق النسخ. واختاره افضل اجابة. :)

2 إجابة

+3 تصويتات
الأمر ليس بهذه الدرجة من التعقيد كما يبدو، حيث يكفي تحميل ملف SQLite3.dll و وضعه في مسار النظام  C:\Windows\System32
تم الرد عليه بواسطة (7,480 نقاط)
+1 تصويت
هنالك شيء غير منطقي، ال near SAVEPOINT يعني ان هنالك كلمة SAVEPOINT في محتوى ال SQL
للدقة، النسخ القديمة من ال SQLite لا تدعم ال SAVEPOINT
على ما يبدو ان المكتبة المستعملة تعتمد عليها بادارة ال Transaction لاحظ موضع الخطأ على فتح ال Tranasactio وليس عند تنفيذ الاستعلام.

فعليا SAVEPOINT لا تنوب عن ال Transactionبالمرة، و ساعطي نقاط سلبية لهذه المكتبة المستعملة.
تم الرد عليه بواسطة (11,910 نقاط)

اسئلة متعلقة

+3 تصويتات
2 إجابة
سُئل سبتمبر 17 في تصنيف Database بواسطة َAbdallah (2,080 نقاط) | 93 مشاهدات
+3 تصويتات
1 إجابة
سُئل أغسطس 11 في تصنيف Database بواسطة Amar Gozim (10,480 نقاط) | 98 مشاهدات
+4 تصويتات
1 إجابة
+3 تصويتات
2 إجابة
سُئل سبتمبر 29 في تصنيف SQL بواسطة Djemoui Benkhalifa (730 نقاط) | 69 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

280 سؤال
486 إجابة
866 تعليق
175 مستخدم