قراءة ملف word مخزن على شكل blob في قاعدة البيانات برادوكس
#1
السلام عليكم
استعمل دلفي 7 لقراءة ملف word مخزن على شكل blob في قاعدة البيانات برادوكس عن طريق olecontainer و استعملت هذا الكود :

PHP كود :
procedure TForm1.Button1Click(Sender: TObject); 
var 
MemStream: TMemoryStream; 
begin 
MemStream 
:= TMemoryStream.Create; 
try 
TBlobField(.table1.FieldByName('doc')).SaveToStream(memstream); 
MemStream.Position :=0; 
OleContainer1.LoadFromStream(memstream); 
finally 
MemStream.Free; 
end; 
END; 


عند التنفيذ تظهر رسالة الخطأ التالية :
:" raised exeption class eOlesyserror with message' %1 éxiste déja ' " apparait lors de l'éxécution

ماهو المشكل أو النقائص في هذا الكود؟
لا اله الا انت سبحانك اني كنت من الظالمين
الرد
#2
وعليكم السلام و رحمة الله

" TOleContainer يستخدم تنسيق خاص في الـ stream لذا لا يمكن إستعمال LoadFromStream ما لم يستخدم SaveToStream الخاص به "
ليس كلامي و لا أدري مدى صحته ،

لذا عندك حلان :
1* حفظ stream الخاص بك إلى ملف مؤقت ثم إستدعائه بـ
كود :
OleContainer1.CreateObjectFromFile('x');
2* تقوم بحفظ قيمة الحقل من نوع blob بإستخدم OleContainer
كود :
var memstrIN:tmemorystream; begin memstrIN :=TMemoryStream.Create; try memstrIN :=TMemoryStream.Create; TBlobField(ADODataSet1.FieldByName('d')).SaveToStream(memstrIN); memstrIN.Seek(0, soFromBeginning); olecontainer1.LoadFromStream(memstrIN); finally memstrIN.Free; end;
الإستدعاء
كود :
var memstrOut:TMemoryStream; begin memstrOut :=TMemoryStream.Create; try olecontainer1.SaveToStream(memstrOut); memstrOut.Seek(0, soFromBeginning); ADODataSet1.Edit ; TBlobField(ADODataSet1.FieldByName('d')).LoadFromStream(memstrOut); ADODataSet1.post ; finally memstrOut.Free; end;
بالتوفيق
الرد
#3
سأقوم الان بتجريب الاقتراح
لا اله الا انت سبحانك اني كنت من الظالمين
الرد
#4
بالنسبة للاقتراح الاول الملف غير موجود في file بل في قاعدة بيانات
تقريبا نفس الكود الذي استعمله و يعطي نفس الخطأ عند التنفيذ .
اذا كنت تقصد بالاستدعاء التخزين في قاعدة المعطيات فليس عندي مشكل في هذا.
لا اله الا انت سبحانك اني كنت من الظالمين
الرد
#5
السلام عليكم
لايبدو لي انك قرأت الرد جيدا ،
إقتباس :بالنسبة للاقتراح الاول الملف غير موجود في file بل في قاعدة بيانات
نعم و أنا قلت إستخرج محتوى الحقل إلى ملف خارجي (لا أذكر أي موضوع كتبتها وكانت رد سؤال لك على ما اذكر ) ومن ثم
كود :
OleContainer1.CreateObjectFromFile('x');
إقتباس :تقريبا نفس الكود الذي استعمله و يعطي نفس الخطأ عند التنفيذ .
يعطيك الخطأ لنفس التعليل السابق تابع التالي
إقتباس :اذا كنت تقصد بالاستدعاء التخزين في قاعدة المعطيات فليس عندي مشكل في هذا.
هذا هو المشكل إذا لم تحفظ قيمة الحقل من olecontainer فستواجه مشكل عند محاولة الإستخراج

أعيدها لك
" TOleContainer يستخدم تنسيق خاص في الـ stream لذا لا يمكن إستعمال LoadFromStream ما لم يستخدم SaveToStream الخاص بـ TOleContainer "
( جربته و على ما يبدو معه حق Smile )

بالتوفيق
الرد
#6
Lam.Abdeldjalil كتب :" TOleContainer يستخدم تنسيق خاص في الـ stream لذا لا يمكن إستعمال LoadFromStream ما لم يستخدم SaveToStream الخاص بـ TOleContainer "
يبدو أني لم أفهم عليك ،يعني أستعمل الكود الخاص ب savetostream ثم الكود الخاص ب loadfromstream بهذا الترتيب أم ماذا !
Smile
لا اله الا انت سبحانك اني كنت من الظالمين
الرد
#7
السلام عليكم

* أدخل كائن الـ OLE (ـ word في حالتك ) بـ TOleContainer إحفظه في الـ stream بإستخدام SaveToStream ضع القيمة الموجودة في الـ stream في الحقل
* الإسترجاع الذي تعرفه

أي الحقول التي تحمل قيم مدخلة سابقا دون إستعمال الطريقة المذكورة لا يمكن فتحها ، هل إتضحت الآن ؟

بالتوفيق
الرد
#8
Lam.Abdeldjalil كتب :* أدخل كائن الـ OLE (ـ word في حالتك ) بـ TOleContainer إحفظه في الـ stream بإستخدام SaveToStream
يعني هكذا ؟؟؟؟؟
كود :
; (TBlobField(table1.FieldByName('doc')).SaveToStream(memstream)
Lam.Abdeldjalil كتب :ضع القيمة الموجودة في الـ stream في الحقل
لماذا أضعها في الحقل و هي أصلا كانت في الحقل و انا استخرجتها من الحقل الى ال stream يعني في الكود الذي كتبته لك فوق اقوم باستخراج محتوى حقل 'doc من قاعدة المعطيات و اضعه في ال stream يعني لماذا اقوم بالعملية العكسية و ارجعه الى الحقل
Lam.Abdeldjalil كتب :* الإسترجاع الذي تعرفه
أي الحقول التي تحمل قيم مدخلة سابقا دون إستعمال الطريقة المذكورة لا يمكن فتحها ، هل إتضحت الآن ؟
بالتوفيق

اخي جزاك الله خيرا ضع لي كود كامل حتى افهم ،فانا كلما اضع ترتيب معين يظهر لي خطأ ،اذا وضعت olecontainer1.SaveToStream(memstream); في الاول يظظهر لي خطأ " operation not allowed on an empty ole container "
و اذا وضعت OleContainer1.LoadFromStream(memstream); في الاول يظهر الخطا السابق" 1 % " أنا افهم فكرتك جيدا لكن لم استطع تطبيقها .
لا اله الا انت سبحانك اني كنت من الظالمين
الرد
#9
شكرا أخ Lam.Abdeldjalil
لقد حل المشكل باستعمال الاقتراح الاول مع اني كنت افضل استعمال ال streams
لا اله الا انت سبحانك اني كنت من الظالمين
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم