PDA

View Full Version : آموزش: ذخیره عکس در database???



mohsen_popo
دوشنبه 20 شهریور 1391, 08:09 صبح
با سلام به همه ی دوستان عزیز......

کسی میتونه به صورت گام به گام ذخیره عکس در دیتابس به من آموزش بده؟؟؟؟

ehsan7007
دوشنبه 20 شهریور 1391, 08:32 صبح
شما یه فیلد از نوع IMAGE درست کن.
یه پیکچر باکسم قرار بده. می تونی برای تصویر پیکچر باکس از open file dialog استفاده کنی.

حالا تصویر پیکچر باکس رو اینطوری می ریزی تو دیتابیس :

اونت کلیک باتن :

try
{
SqlCommand cmd = new SqlCommand() { Connection = con };
if (con.State == ConnectionState.Closed)
{
con.Open();
}


if (@ImageName != "")
{

FileStream fs = new FileStream(@ImageName, FileMode.Open, FileAccess.Read);
byte[] picbyte = new byte[fs.Length];
fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
cmd.CommandText = "insert into table(نام فیلد ها)values(نام فیلد ها به اضافه ی @ به اول اونا)";
cmd.Parameters.AddWithValue("@pic", picbyte);

}
else
{
cmd.CommandText = "insert into table(نام فیلد ها)values(نام فیلد ها به اضافه ی @ به اول اونا)";
}

cmd.Parameters.Add("@نام فیلد", SqlDbType.NVarChar).Value = textBox1.Text;

//سایر فیلد ها


if (cmd.ExecuteNonQuery() == 1)
{
MessageBox.Show("اطلاعات با موافقيت ثبت گرديد", "ثبت",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);

}
cmd.Parameters.Clear();




this.نام تیبل ادپتور.Fill(this.نام فایل XSD .نام تیبل);

con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

یوزینگ :

using System.IO;

این رو هم تعریف کن :

string ImageName = string.Empty;

موفق باشی!

raziyehbazargan
دوشنبه 20 شهریور 1391, 08:43 صبح
اما میگن دیگه نباید از نوع image استفاده کرد و باید از نوع varbainary max استفاده کنند

mohsen_popo
دوشنبه 20 شهریور 1391, 09:00 صبح
برای open dialog که کد خواصی که نمی خواد.؟؟؟؟؟ ؟(منظور آدرس عکس)؟

برای ذخیره از bit به جای image استفاده کرد.؟

ehsan7007
دوشنبه 20 شهریور 1391, 09:19 صبح
این برای باتن مسیر تصویر :

try
{
OpenFileDialog Ofd = new OpenFileDialog() { Filter = "Image Files(*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;* .PNG", Title = "انتخاب تصوير" };
if (Ofd.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = System.Drawing.Image.FromFile(Ofd.FileName);
ImageName = Ofd.FileName;
}
}
catch (Exception)
{
ImageName = "";
}


اما میگن دیگه نباید از نوع image استفاده کرد و باید از نوع varbainary max استفاده کنند

در مورد "باید " چیزی نشنیدم . فکر نمی کنم مشکلی داشته باشه .

kkkaka
دوشنبه 20 شهریور 1391, 09:50 صبح
سلام
بله شما کافیه با open dialog آدرس عکسو بفرستی.
بنده از نوع Image استفاده میکنم و هیچ ایرادی هم نداره.

samadblaj
دوشنبه 20 شهریور 1391, 09:56 صبح
سلام میشه کده برای نمایش از طریق linq هم یکی بذاره؟
با استفاده از کد های زیر عکس رو ذخیره میکنم اما نمیتونم برای نمایشش مثلا توی یه Picturebox استفده کنم؟


private void button2_Click(object sender, EventArgs e)
{
byte[] imageData = ReadFile(textBox1.Text);

bankEntities db = new bankEntities();
Picture_Save ps = new Picture_Save()
{
name = "image",
image = imageData,
note = "tttttttt"
};
db.Picture_Save.AddObject(ps);
db.SaveChanges();
dataGridView1.DataSource = db.Picture_Save;
}

mohsen_popo
دوشنبه 20 شهریور 1391, 09:57 صبح
دستت بی بلا..

Arash_janusV3
دوشنبه 20 شهریور 1391, 11:53 صبح
ذخیره کردن یک تصویر
(http://barnamenevis.org/showthread.php?346847-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C&p=1579359&viewfull=1#post1579359) نمایش تصاویر ذخیره شده در جدول (http://barnamenevis.org/showthread.php?346847-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C&p=1581287&viewfull=1#post1581287)

samadblaj
دوشنبه 20 شهریور 1391, 12:01 عصر
ذخیره کردن یک تصویر
نمایش تصاویر ذخیره شده در جدول

جاوس جان ممنونم از لطفت خودم یه سورس ADO برای نمایش عکس داشتم اما هر چی دستکاری کردم نتونستم به LINQ بازنویسیش کنم. تشکر

Mahmoud Zaad
دوشنبه 20 شهریور 1391, 13:17 عصر
سلام میشه کده برای نمایش از طریق linq هم یکی بذاره؟
با استفاده از کد های زیر عکس رو ذخیره میکنم اما نمیتونم برای نمایشش مثلا توی یه Picturebox استفده کنم؟


private void button2_Click(object sender, EventArgs e)
{
byte[] imageData = ReadFile(textBox1.Text);

bankEntities db = new bankEntities();
Picture_Save ps = new Picture_Save()
{
name = "image",
image = imageData,
note = "tttttttt"
};
db.Picture_Save.AddObject(ps);
db.SaveChanges();
dataGridView1.DataSource = db.Picture_Save;
}

سلام
اینجوری میشه:


var query1 = (from C in lbank.tb_customers where C.CustomerID == 1 select C.Pic).SingleOrDefault();
MemoryStream ms = new MemoryStream((byte[])(query1));
pictureBox1.Image = Image.FromStream(ms);

lbank یه نمونه ازشی LinqToSql هست. توی این کد، رکوردی از جدول tb_customer که CustomerID اش مساوی یک بود رو انتخاب کردیم و عکس(Pic) رو توی پیکچر باکس نشون دادیم.
برای نشون دادن توی دیتاگرید ویو که مشکل خاصی نیست:


var query = from C in lbank.tb_customers select C;
dataGridView1.DataSource = query;

فقط نکته ای که هست توی فایل dbml باید فیلد عکس رو انتخاب کنی و در قسمت Properties نوع (Type) اش رو روی
byte[] قرار بدی. نوع داده ای توی بانک هم
VarBinary(MAX) هست.


البته برای اینکه اگه عکسی وجود نداشت خطا نداشته باشیم بهتر کد رو به صورت زیر بنویسید:


var query1 = (from C in lbank.tb_customers where C.CustomerID == 2 select C.Pic).SingleOrDefault();
if (query1 != null)
{
MemoryStream ms = new MemoryStream((byte[])(query1));
pictureBox1.Image = Image.FromStream(ms);
}
else
{
pictureBox1.Image = null;
}

Mahmoud Zaad
چهارشنبه 22 شهریور 1391, 21:05 عصر
ذخیره عکس در دیتابیس با استفاده از LinqToSql:
اسکریبپ دیتابیس هم هست ولی خودتون به راحتی می تونید یه جدول به اسم tb_customer و سه تا فیلد به اسمهای CustomerID با نوع Int و Customer با نوع varchar(50) و Pic از نوع varbinary(max) بسازید و LinqToSql رو از روی همین بانک بنا کنید!

SharpSabre
جمعه 24 شهریور 1391, 02:35 صبح
می شه بگید که اگر یک PictureBox + یک کلید که توسط OpenFileDialog1 عکس رو داخلش می ذاره ، همراه با بفیه فیلد های دیگه چطور بریزیم تو OleDB ?
string query = "INSERT INTO [User Info] (Name,Family,image) VALUES ('" + textBox1.Text + "','" +'" + textBox2.Text + "','" + PictureBox.imageLocation + "');
یا دیگه String query نمی شه استفاده کرد ؟

ممنون

Mahmoud Zaad
جمعه 24 شهریور 1391, 10:23 صبح
می شه بگید که اگر یک PictureBox + یک کلید که توسط OpenFileDialog1 عکس رو داخلش می ذاره ، همراه با بفیه فیلد های دیگه چطور بریزیم تو OleDB ?
string query = "INSERT INTO [User Info] (Name,Family,image) VALUES ('" + textBox1.Text + "','" +'" + textBox2.Text + "','" + PictureBox.imageLocation + "');
یا دیگه String query نمی شه استفاده کرد ؟

ممنون
اینجا (http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE&p=564359&highlight=%D8%B9%DA%A9%D8%B3#post564359)یه نمونه هست.

SharpSabre
جمعه 24 شهریور 1391, 15:42 عصر
اینجا (http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE&p=564359&highlight=%D8%B9%DA%A9%D8%B3#post564359)یه نمونه هست.
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
byte[] bytes = File.ReadAllBytes(openFileDialog.FileName);
cmd.Parameters.Clear();
cmd.Parameters.Add("@Pic", OleDbType.Binary).Value = bytes;
doCmd("insert into table1 (picture) values(@pic)");
}
این رو از همون نمونه که فرمودید استفاده می کنم ،، اگه عکس رو انتخاب کنم Error می ده و اصلا خودش OpenFileDialog رو باز می کنه
اینو نمی شه تغییر بدید که از PictureBox استفاده شه ؟

ممنونم.

Mahmoud Zaad
جمعه 24 شهریور 1391, 17:59 عصر
اینجوری بنویسید:
if (pictureBox1.Image != null)
{
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrpic = ms.GetBuffer();
ms.Close();
cmd.Parameters.Add("@Pic",arrpic);
}
else
{
cmd.Parameters.Add("@Pic", DBNull.Value);

}

SharpSabre
جمعه 24 شهریور 1391, 18:53 عصر
این دستور رو قراردادم همه چی خوب و عالی اجرا می شه ولی ظاهرا عکس تو فایل DB نمی ره ! من بجای Pic متغیر خودم رو گذاشتم .
نباید اینو :
cmd.CommandText = "Insert INTO [User Info] (Avatar) VALUES (@arrpic)";
بعد از پارامتر اضافه کنم ؟

samadblaj
یک شنبه 28 آبان 1391, 20:25 عصر
ذخیره عکس در دیتابیس با استفاده از LinqToSql:
اسکریبپ دیتابیس هم هست ولی خودتون به راحتی می تونید یه جدول به اسم tb_customer و سه تا فیلد به اسمهای CustomerID با نوع Int و Customer با نوع varchar(50) و Pic از نوع varbinary(max) بسازید و LinqToSql رو از روی همین بانک بنا کنید!

آقای میثم عزیز دوباره تشکر بابت پست مفیدوتون یه سوالی که برام پیش اومده من یه برنامه دارم مینویسم که نیاز به پیوست یک سری اطلاعات نظیر فایل های word هستش آیا از این روش میشه؟؟؟
به نظر شما نحوه خواندن رو به چه شکل ایجاد کنم؟ یعنی بعد از اینکه فایل پیوست شد دریافت فایل به چه شکل میشه؟

Mahmoud Zaad
یک شنبه 28 آبان 1391, 20:46 عصر
سلام
میثم هستم.
برای ذخیره فایل در دیتابیس:
FileStream fs = new FileStream(FileAddress, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
br.Close();
fs.Close();
برای دریافت (دانلود) فایل در مکان دلخواه (با فرض اینکه فایل ها در گرید لود شده باشند) :
SaveFileDialog sfd = new SaveFileDialog();
//sfd.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
sfd.Title = "ذخیره";
sfd.FileName = dataGridView1.CurrentRow.Cells["name"].Value.ToString();
if (sfd.ShowDialog() == DialogResult.OK)
{
byte[] fileData = (byte[])(dataGridView1.CurrentRow.Cells["ole"].Value);
FileStream fs = new FileStream(sfd.FileName, FileMode.Create, FileAccess.ReadWrite);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(fileData);
bw.Close();
MessageBox.Show("Saved");
}

samadblaj
یک شنبه 28 آبان 1391, 20:54 عصر
مرسی... عالی بود کاملا جواب داد.

mohammad5593
شنبه 20 مهر 1392, 17:23 عصر
ذخیره عکس در دیتابیس با استفاده از LinqToSql:
اسکریبپ دیتابیس هم هست ولی خودتون به راحتی می تونید یه جدول به اسم tb_customer و سه تا فیلد به اسمهای CustomerID با نوع Int و Customer با نوع varchar(50) و Pic از نوع varbinary(max) بسازید و LinqToSql رو از روی همین بانک بنا کنید!
چرا از SQL ایراد می گیره؟

Mahmoud Zaad
شنبه 20 مهر 1392, 19:14 عصر
چه ایرادی؟ لطفاً متن یا تصویر خطا رو قرار بدید.