(27-02-19, 02:57 AM)elgokr كتب :وعليكم السلام ورحمة الله وبركاته
مرحباً اخى الكريمشوف لتوضيح الامر بسهولة جداً
لنقول الان انك تقوم بعمل تحويل الملف اى كان الامتداد من امتتداد حسب الملف الى byte
الى هنا وجميل ويتم ذلك من خلال هذا السطر
كود :
byte[] barray = System.IO.File.ReadAllBytes(dlg.FileName);
الان عند اتمام تسجيل او حفظ الملف بقاعدة البيانات يتم من خلال هذا السطر لديك
كود :
cmd = new SqlCommand("Insert into TB_In (Id,Number,Organization,Date,Type,Title,Notes,FileName,FileData) Values ('" + text_Id.Text + "','" + comboBox1.Text + "','" + text_Number.Text + "','" + dateTimePicker1.Value + "','" + comb_Type.Text + "','" + text_Title.Text + "','" + text_Notes.Text + "','" + filename + "', '" + barray + "' )", con);
والى هنا لا يوجد مشكلة لديك فى اتمام ذلك وما تفعله ايضاً هو حفظ اسم الملف والامتداد من خلا filename
والذى يتم تعبئته القيمة من خلال هذا السطركود :
string filename = System.IO.Path.GetFileName(dlg.FileName);
الان كل ما تحتاج اليه لفعل العكس وهو قراءة الـ byte الى ملف حسب الامتداد
فى البداية ستقوم بعمل استعلام مثلاً كالتالى [ الاستعلام لتوضيح الفكرة وليس للتطبيق ]
كود :
SELECT FileName,FileData FORM TB_In WHERE Id=1
الان الاستعلام عبارة عن جلب صف واحد من الجدول تحت رقم 1 لـ IDومن خلالها يتم جلب كلاً من عمود اسم الملف و عمود byte للملف المخزن
الان لنقوم تم تخزين الاستعلام فى DT وهو DataTableركز هنا جيداً وبداية الان حتى تفهم كيفية التعامل مع الامر
الان اصبح معى
كود :
DT.Rows[0]["FileName"]
وهو يخص اسم الملف و الامتداد الخاص به
وكذلك اصبح معى
كود :
DT.Rows[0]["FileData"]
وهو يخص الملف المخزن بقاعدة البيانات
الان سنقوم بعمل الكود الاول وهو
كود :
string[] fi = DT.Rows[0]["FileName"].ToString().Split('.');
طيب ماذا يعنى هذا الكود [ لا يشرط عمل هذا السطر او استخدامه بنائاً لما تلاحظة فى الاكواد القادمة ]تم وضع هذا السطر من الكود حتى تتمكن من الاستفادة منه من افكار
لنتخيل مثلاً ان اسم الملف والامتداد المسجل فى قاعدة البيانات هو
PHP كود :
FileName.exe
وبمجرد ما قمت بعمل السطر الاخير من الكود يعنى انا قمت بعمل تقسيم لاسم الملف ليصبح كالتالى
PHP كود :
FileName
exe
ليصبح كل جزء على حدي
الان ناتى للخطوة الثانية وهو انشاء مسار مخصص لحفظ الملف [يطبق هذا الكود اذا كنت تريد تشغيل الملف فعلياً وليس للعرض فقط ]
كود :
string Patch = System.IO.Path.GetTempPath() + "Temp_test." + fi[1];
أو ممكن بهذا الشكل
كود :
string Patch = System.IO.Path.GetTempPath() + DT.Rows[0]["FileName"];
الان ناتى الى تحول كود الملف الذى بقاعدة البيانات الى ملف فعلى على الجهاز لاتمام تشغيله
كل ما عليك استخدام الكود بهذا الشكل
كود :
byte[] runFile = (byte[])DT.Rows[0]["FileData"];
System.IO.File.WriteAllBytes(Patch, runFile);
والان لاتمام تشغيل الملف مباشراً طبق السطر التالى
كود :
System.Diagnostics.Process.Start(Patch);
طيب ولو لاستدعاء اسم الملف من قاعدة البيانات دون تشغيليكفي فقط استخدام الكود التالى
كود :
MessageBox.Show(DT.Rows[0]["FileName"]);
ولاستخدام المسار بعد تكون الملف فاليك استخدام الكود التالى
كود :
MessageBox.Show(Patch);
الان بعد الانتهاء يفضل دائماً تنفيذ كود تفريغ مجلد Temp الخاص بالجهازخاصة هذا المسار
كود :
MessageBox.Show(System.IO.Path.GetTempPath());
لا اعلم اذا شرحي هنا جيداً وقد تصل لك الفكرة كاملاًفسامحنى اذا كنت مخطاء او سهوت عن شئ فى الشرح
اذا كان السورس مرفق كمثال لما تريده مع قاعدة البيانات / سكربت قاعدة البياناتلكان الامر اسهل وابسط فى عمل الكود كاملاً عملياً مع الشرح بدلاً من الشرح النظري هنا
اتمنى ان تتمكن من التعامل مع الشرح صحيحة وان تكون الفكرة وصلت لكوسامحنى مجدداً اذا يوجد اى اخطاء فجميع ما فى الرد كتابتاً منى دون اختبار
تحياتى لكوتمنياتى لك التوفيق
شكرا جزيلا اخي العزيز على المجهود الرائع لكن حاولت تنفيذ الكود على البوتون الموجود في الفورم لا يمكن التحميل كما انا بحاجة لتحميل الملف من خلال البوتون الموجود في الداتا كرد فيو. ((وانا كلي امتنان وشكر لك ولشرحك الجميل))
