خزن ملفات داخل قاعدة البيانات - رسول555 - 26-02-19
السلام عليكم اخوتي الاعزاء
واجهت مشكلة في المشروع وهي خزن ملف معين باي صيغة تمكنت من خزن الملف ولكن لم اتمكن من استرجاع الملف من البوتون الموجود في الداتا كرد فيو لذا ارجو من الاخوة الخبراء النظر في كودات الفورم.
وسوف ادرج كودات الفورم كاملا قد يكون الخلل في مكان معين مع الشكر الجزيل
كود :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
namespace banat_alhssan
{
public partial class In_form : Form
{
//string folder = "";
//كود ربط الفيجوال بيسك مع sql//
SqlConnection con = new SqlConnection(@"Server= DESKTOP-KJB46EH\MORABSQLE ;Database=DB;Integrated Security=True");
SqlCommand cmd;
SqlDataAdapter Da;
DataTable dt = new DataTable();
public In_form()
{
InitializeComponent();
dataGridView1.Columns.Clear();
rasool();
shamas();
}
void rasool()
{
//تعبئة الداتا كرد فيو
cmd = new SqlCommand("select * from TB_In", con);
Da = new SqlDataAdapter(cmd);
Da.Fill(dt);
this.dataGridView1.DataSource = dt;
// dataGridView1.Columns[1].Width = 120;
dataGridView1.Columns[0].HeaderText = "التسلسل";
dataGridView1.Columns[1].HeaderText = "رقم الكتاب";
dataGridView1.Columns[2].HeaderText = "الجهة";
dataGridView1.Columns[3].HeaderText = "التاريخ";
dataGridView1.Columns[4].HeaderText = "نوع الكتاب";
dataGridView1.Columns[5].HeaderText = "العنوان";
dataGridView1.Columns[6].HeaderText = "الملاحظات";
dataGridView1.Columns[7].HeaderText = "اسم الملف";
dataGridView1.Columns[8].HeaderText = "نسخة الملف";
dataGridView1.Columns[8].Visible = false;
//تعبئة الكومبوكس
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "Organization";
// عمل بوتون
DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
btn.HeaderText = "المرفقات";
btn.Text = "الملف";
btn.UseColumnTextForButtonValue = true;
dataGridView1.Columns.Add(btn);
}
void shamas()
//تعبئة الكومبوكس
{
// Da = new SqlDataAdapter("select * from TB_In ", con);
// Da.Fill(dt);
// comboBox1.DataSource = dt;
//comboBox1.DisplayMember = "Organization";
// comboBox1.ValueMember = "Id";
}
private void In__Load(object sender, EventArgs e)
{
}
private void label6_Click(object sender, EventArgs e)
{
}
private void but_out_Click(object sender, EventArgs e)
{
this.Close();
}
private void but_new_Click(object sender, EventArgs e)
{
text_Id.Clear();
text_Number.Clear();
text_Title.Clear();
text_Notes.Clear();
comb_Type.Text = "";
comboBox1.Text = "";
groupBox1.Enabled = true;
but_Save.Enabled = true;
but_add.Enabled = true;
teba();
}
void teba()
// ترقيم تلقائي
{
SqlCommand cmd = new SqlCommand("select ISNULL (MAX(Id)+1,1) from TB_In", con);
con.Open();
SqlDataReader Ra = cmd.ExecuteReader();
Ra.Read();
text_Id.Text = Ra[0].ToString();
Ra.Close();
con.Close();
}
private void but_Save_Click(object sender, EventArgs e)
{
//كود الملأ الاجباري
if (comboBox1.Text == "" || text_Number.Text == "" || dateTimePicker1.Text == "" || comb_Type.Text == "" || text_Title.Text=="")
{
MessageBox.Show("الرجاء ملأ جميع الحقول");
}
else
{
OpenFileDialog dlg = new OpenFileDialog();
DialogResult dlgRes = dlg.ShowDialog();
if (dlgRes != DialogResult.Cancel)
{
byte[] barray = System.IO.File.ReadAllBytes(dlg.FileName);
//extract the filename only from the selected path
string filename = System.IO.Path.GetFileName(dlg.FileName);
try
{
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);
//إقرا الملف
// create sql parameters
con.Open();
cmd.ExecuteNonQuery();
//MessageBox.Show("تم الحفظ النص");
}
catch (SqlException ex)
{
MessageBox.Show("تم الحفظ" + ex.Message);
}
finally
{
con.Close();
//ward();
}
text_Id.Text = "";
comboBox1.Text = "";
text_Number.Text = "";
comb_Type.Text = "";
text_Title.Text = "";
text_Notes.Text = "";
teba();
}
}
}
private SqlCommand SqlCommand(string p, SqlConnection con)
{
throw new NotImplementedException();
}
//void ward()
//{
//for (int i=0; i< listView1.Items.Count;i++)
//{
// SqlCommand cmd =new SqlCommand("Insert into TB_In (FileData,FileName,FileType) values(@fd,@fn,@ft",con);
// cmd.Parameters.AddWithValue("@fd",File.ReadAllBytes(listView1.Items[i].SubItems[0].Text));
// cmd.Parameters.AddWithValue("@fn",listView1.Items[i].SubItems[1].Text);
// cmd.Parameters.AddWithValue("@ft",listView1.Items[i].SubItems[2].Text);
// //con.Open();
// cmd.ExecuteNonQuery();
// con.Close();
////}
// MessageBox.Show("تم الحفظ الملف");
//}
private void button1_Click()
{
throw new NotImplementedException();
}
// cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int)).Value = text_Id.Text;
// cmd.Parameters.Add(new SqlParameter("@Number", SqlDbType.VarChar)).Value = comboBox1.Text;
// cmd.Parameters.Add(new SqlParameter("@Organization", SqlDbType.VarChar)).Value = text_Number.Text;
// cmd.Parameters.Add(new SqlParameter("@Date", SqlDbType.DateTime)).Value = dateTimePicker1.Value;
//cmd.Parameters.Add(new SqlParameter("@Type", SqlDbType.VarChar)).Value = comb_Type.Text;
//cmd.Parameters.Add(new SqlParameter("@Title", SqlDbType.VarChar)).Value = text_Title.Text;
//cmd.Parameters.Add(new SqlParameter("@Notes", SqlDbType.VarChar)).Value = text_Notes.Text;
//con.Open();
//cmd.ExecuteNonQuery();
//con.Close();
// cmd = new SqlCommand("TB_In", con);
// cmd.CommandType = CommandType.StoredProcedure;
// SqlParameter[] param = new SqlParameter[7];
// param[0]=new SqlParameter("@Id",SqlDbType.Int);
// param[0].Value=text_Id.Text;
// param[1] = new SqlParameter("@Number", SqlDbType.VarChar, 50);
// param[1].Value = comboBox1.Text;
//param[2] = new SqlParameter("@Organization", SqlDbType.VarChar, 50);
//param[2].Value = text_Number.Text;
//param[3] = new SqlParameter("@Date", SqlDbType.DateTime);
//param[3].Value = dateTimePicker1.Text;
//param[4] = new SqlParameter("@Type", SqlDbType.VarChar, 50);
//param[4].Value = comb_Type.Text;
//param[5] = new SqlParameter("@Title", SqlDbType.VarChar, 50);
//param[5].Value = text_Title.Text;
//param[6] = new SqlParameter("@Notes", SqlDbType.VarChar, 50);
//param[6].Value = text_Notes.Text;
// cmd.Parameters.AddRange(param);
//con.Open();
//cmd.ExecuteNonQuery();
//con.Close();
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void but_add_Click(object sender, EventArgs e)
{
//FolderBrowserDialog opendlg = new FolderBrowserDialog();
//if (opendlg.ShowDialog() == DialogResult.OK)
//{
// folder = opendlg.SelectedPath;
// }
//foreach(DataRow dr in dt.Rows)
//{
// string file_name = dr["FileName"].ToString();
// string file_type = dr["FileData"].ToString();
// string full_file_name = file_type;
// byte[] data = dr["FileData"] as byte[];
// File.WriteAllBytes(folder +"\\" + full_file_name, data);
//}
//MessageBox.Show("تم التحميل");
// cmd = con.CreateCommand();
//try
//{
// con.Close();
// con.Open();
// cmd.CommandText = "insert into TB_In (data) values (@data_file)";
// cmd.ExecuteNonQuery();
// con.Close();
//}
//catch (SqlException ex)
//{
// MessageBox.Show(ex.Message);
//}
//try
//{
// int f1 = 0;
// string p1;
// //p1 = openFileDialog1.FileName;
// FileStream fs = new FileStream(p1, FileMode.Open);
// byte[] buffer = new byte[fs.Length];
// fs.Read(buffer, 0, (int)fs.Length);
// fs.Close();
// string query = "insert into TB_In (data) values (@data_file)";
// SqlCommand com = new SqlCommand(query, con);
// com.Parameters.AddWithValue("@data_file", buffer);
// con.Open();
// com.ExecuteNonQuery();
// {
// f1 = 1;
// }
// if (f1 == 1)
// {
// MessageBox.Show("File saved into database");
// }
//}
//catch (Exception e1)
//{
// MessageBox.Show(e1.Message);
//}
//OpenFileDialog opn = new OpenFileDialog();
//opn.Multiselect = true;
//if (opn.ShowDialog() == DialogResult.OK)
//{
// foreach (string p in opn.FileNames)
// {
// ListViewItem itm = new ListViewItem(p);
// itm.SubItems.Add(Path.GetFileNameWithoutExtension(p));
// itm.SubItems.Add(Path.GetExtension(p));
// listView1.Items.Add(itm);
// }
//}
}
public string p { get; set; }
public string P { get; set; }
private void groupBox1_Enter(object sender, EventArgs e)
{
}
internal static void show()
{
throw new NotImplementedException();
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex ==9)
{
Frm_priv_user1 shams = new Frm_priv_user1();
shams.Show();
}
}
public string pa { get; set; }
}
}
RE: خزن ملفات داخل قاعدة البيانات - elgokr - 27-02-19
وعليكم السلام ورحمة الله وبركاته
مرحباً اخى الكريم
شوف لتوضيح الامر بسهولة جداً
لنقول الان انك تقوم بعمل تحويل الملف اى كان الامتداد من امتتداد حسب الملف الى 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('.');
طيب ماذا يعنى هذا الكود [ لا يشرط عمل هذا السطر او استخدامه بنائاً لما تلاحظة فى الاكواد القادمة ]
تم وضع هذا السطر من الكود حتى تتمكن من الاستفادة منه من افكار
لنتخيل مثلاً ان اسم الملف والامتداد المسجل فى قاعدة البيانات هو
وبمجرد ما قمت بعمل السطر الاخير من الكود يعنى انا قمت بعمل تقسيم لاسم الملف ليصبح كالتالى
ليصبح كل جزء على حدي
الان ناتى للخطوة الثانية وهو انشاء مسار مخصص لحفظ الملف [يطبق هذا الكود اذا كنت تريد تشغيل الملف فعلياً وليس للعرض فقط ]
كود :
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());
لا اعلم اذا شرحي هنا جيداً وقد تصل لك الفكرة كاملاً
فسامحنى اذا كنت مخطاء او سهوت عن شئ فى الشرح
اذا كان السورس مرفق كمثال لما تريده مع قاعدة البيانات / سكربت قاعدة البيانات
لكان الامر اسهل وابسط فى عمل الكود كاملاً عملياً مع الشرح بدلاً من الشرح النظري هنا
اتمنى ان تتمكن من التعامل مع الشرح صحيحة وان تكون الفكرة وصلت لك
وسامحنى مجدداً اذا يوجد اى اخطاء فجميع ما فى الرد كتابتاً منى دون اختبار
تحياتى لك
وتمنياتى لك التوفيق
RE: خزن ملفات داخل قاعدة البيانات - رسول555 - 27-02-19
(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('.');
طيب ماذا يعنى هذا الكود [ لا يشرط عمل هذا السطر او استخدامه بنائاً لما تلاحظة فى الاكواد القادمة ]
تم وضع هذا السطر من الكود حتى تتمكن من الاستفادة منه من افكار
لنتخيل مثلاً ان اسم الملف والامتداد المسجل فى قاعدة البيانات هو
وبمجرد ما قمت بعمل السطر الاخير من الكود يعنى انا قمت بعمل تقسيم لاسم الملف ليصبح كالتالى
ليصبح كل جزء على حدي
الان ناتى للخطوة الثانية وهو انشاء مسار مخصص لحفظ الملف [يطبق هذا الكود اذا كنت تريد تشغيل الملف فعلياً وليس للعرض فقط ]
كود :
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());
لا اعلم اذا شرحي هنا جيداً وقد تصل لك الفكرة كاملاً
فسامحنى اذا كنت مخطاء او سهوت عن شئ فى الشرح
اذا كان السورس مرفق كمثال لما تريده مع قاعدة البيانات / سكربت قاعدة البيانات
لكان الامر اسهل وابسط فى عمل الكود كاملاً عملياً مع الشرح بدلاً من الشرح النظري هنا
اتمنى ان تتمكن من التعامل مع الشرح صحيحة وان تكون الفكرة وصلت لك
وسامحنى مجدداً اذا يوجد اى اخطاء فجميع ما فى الرد كتابتاً منى دون اختبار
تحياتى لك
وتمنياتى لك التوفيق
شكرا جزيلا اخي العزيز على المجهود الرائع لكن حاولت تنفيذ الكود على البوتون الموجود في الفورم لا يمكن التحميل كما انا بحاجة لتحميل الملف من خلال البوتون الموجود في الداتا كرد فيو. ((وانا كلي امتنان وشكر لك ولشرحك الجميل))
RE: خزن ملفات داخل قاعدة البيانات - elgokr - 27-02-19
الشكر لله والحمد لله
والحمد لله على كل حال
فى البداية الاكواد التى بالشرح لا يعنى ان تقوم بتطبيقها كلياً واستخدامها
فمثلاً كما فى الصورة انت وصلت لتمكنت من عرض اسم الملف والمسار كا رسالة
فبدلاً من هذا السطر لظهور رسالة وهو
كود :
MessageBox.Show(Patch);
تقوم باستخدام السطر التالى
كود :
System.Diagnostics.Process.Start(Patch);
لكن لا اعلم اذا كان الكود كاملاً ام انه الكود الخاص بالشرح فقط
حيث ان الصورة الثانية تشير الى انك تستخدم الكود الخاص بى فقط
ولا الاحظ بكود الاستعلام لجلب قيمة DT أو باصح بما ان القيم موجودة ومدرجة بالداتا جريد
فكل ما تحتاج اليه هو قيمة العمود الخاص بالملف الموجود بالاستعلام الذى مرحل الى الداتا جريد
اتمنى لو ترفق المشروع مع سكربت لقاعدة البيانات
حتى اقوم بوضع الكود داخل الزر لتوضح الصورة معك كاملاً
تحياتى لك
وتمنياتى لك التوفيق
RE: خزن ملفات داخل قاعدة البيانات - رسول555 - 27-02-19
شكرا جزيلا لك اخي العزيز هذه نسخة المشروع مع الشكر
RE: خزن ملفات داخل قاعدة البيانات - رسول555 - 28-02-19
هذه صورة لقاعدة البيانات علما اني ادرجت نسخة من القاعدة مع المشروع
RE: خزن ملفات داخل قاعدة البيانات - elgokr - 01-03-19
الشكر لله والحمد لله
والحمد لله على كل حال
فى البداية السورس يبدو انك حاولت ان تقوم بحذف كل من الشاشات بالمشروع
ولكن لم يتم حذفها بشكل صحيح وكذلك انت قمت بارفاق نسخة احتياطية من قاعدة البيانات
وليست قاعدة البيانات نفسها على اى حال بعد رؤية الصور مع الاكواد المستخدمة فى الشاشة بالمشروع
فكل ما اتمكن من افادتك به لتنفيذ الامر هو التالى
تعال فى حدث : but_add_Click واجعل الكود به بهذا الشكل
كود :
// جلب بيانات المرفق
var IDNum = dataGridView1.Rows[DgId].Cells[0].Value;
cmd = new SqlCommand("SELECT FileName, FileData FROM TB_In WHERE Id = " + IDNum, con);
Da = new SqlDataAdapter(cmd);
Da.Fill(dt1);
string[] fi = dt1.Rows[0]["FileName"].ToString().Split('.');
byte[] runFile = (byte[])dt1.Rows[0]["FileData"];
string Patch = System.IO.Path.GetTempPath() + dt1.Rows[0]["FileName"];
System.IO.File.WriteAllBytes(Patch, runFile);
System.Diagnostics.Process.Start(Patch);
MessageBox.Show("تم فتح الملف");
الان ناتى فى خطوة مهمة لمعالجة الخطاء بالكود فى السطر الاول وهو خاصة DgId
ولحل هذا كل ما عليك اضافة هذا السطر
كود :
public int DgId { get; set; }
فى اى مكان تريد اضافته فكما تشاء
وبالنهاية ناتى للنقطة الاخير وقبل الحفظ واختبار الامر
وهو اضافة الكود التالى فى هذا الحدث : dataGridView1_CellClick
شرح كل جزء ...
بخصوص DgId تم تعريفه انه من نوع رقم
من ثم فى حدث dataGridView1_CellClick تم تعريف قيمة DgId بقيمة رقم الصف من الداتا جريد
بحيث كلما تم الضغط على اى مكان فى الصف او تم تحديد الصف يتم جلب هذه القيمة لـ DgId
وبالنهاية فى حدث الزر وهو but_add_Click تم عمل استعلام لجلب ملف المرفق ومن ثم تكوين الملف بالجهاز ومن ثم فتحه
طبعاً كان بامكان استغناء من كود الاستعلام وبما انك بالفعل قمت بعمل جلب جميع محتوى الملف
وقمت بتعبئته بالداتا جريد مع اخفاء عمود المرفقات كما فى كود السورس فبامكانك ان تستفاد بان يكون كود الزر
وهو خاص بحدث : but_add_Click على هذا الشكل
كود :
byte[] runFile = (byte[])dataGridView1.Rows[DgId].Cells[8].Value;
string Patch = System.IO.Path.GetTempPath() + dataGridView1.Rows[DgId].Cells[7].Value;
System.IO.File.WriteAllBytes(Patch, runFile);
System.Diagnostics.Process.Start(Patch);
MessageBox.Show("تم فتح الملف");
حيث ان رقم 7 يشير الى اسم الملف مع الامتداد الخاص به
وكذلك رقم 8 يشير الى الملف المرفق بقاعدة البيانات
يمكنك اختبار كلا من الكود الحدث بعد اضافة الباقي كما مشار له بالشرح
تذكر ان الاكواد والشرح مبني على كتابة منى وبدون اختبار لعدم عمل السورس جيداً
وايضاً لعدم وجود قاعدة البيانات نفسها مع السورس وبامر الله الكود سيعمل معك مباشر بدون التعديل
تحياتى لك
وتمنياتى لك التوفيق
RE: خزن ملفات داخل قاعدة البيانات - رسول555 - 02-03-19
شكرا لك اخي العزيز وانا ممتن لك كثيرا لكن لا اعلم اين المشكلة لان في كل مرة احاول فتح الملف المخزن لا يمكن هل المشكلة في القاعدة ام في المشروع قد ارفقت المشروع كامل مع القاعدة مع الشكر
RE: خزن ملفات داخل قاعدة البيانات - elgokr - 07-03-19
مرحباً اخى رسول555
اتمنى مراجعة الرابط التالى ستجد به ما تريده تماماً
اتمنى ان يكون الشرح داخل السورس مبسط وبدون اى متاهة به
تحياتى لك
وتمنياتى لك التوفيق
RE: خزن ملفات داخل قاعدة البيانات - رسول555 - 08-03-19
بارك الله في جهودكم المباركة وجعله في ميزان حسناتكم
كم انت متالق يامبدع
|