PDA

View Full Version : انتقال عکس از دیتا بیس SQL به PictureBox



debugger
چهارشنبه 24 تیر 1388, 02:00 صبح
با عرض سلام خدمت دوستان

من چند تا عکس را در بانکم که sql2005 هست ذخیره کردم

حالا میخوام وقتی طرف روی یکی از ردیف های گرید کلیک کرد عکس طرف را در picturebox نشون بده

شبیه وقتی که روی یک ردیف کلیک می کنیم اطلاعات به textbox ها منتقل می شد

من میخوام عکس به picture box منتقل بشه

با این کد ها عکس را ذخیره کردم

با این کد ها ذخیره می کنم :




string SQLString = "";
SQLString = "INSERT INTO tbk(esm,tel,aks) VALUES(@esm,@tel,@aks";
//

MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrPic = ms.GetBuffer();
ms.Close();
//

SqlCommand SQLCommand = new SqlCommand();
SQLCommand.CommandText = SQLString;
SQLCommand.Connection = database;
SQLCommand.Parameters.Add("@aks", SqlDbType.VarBinary).Value = arrPic;
SQLCommand.Parameters.Add("@esm", SqlDbType.NVarChar, 50).Value = textBox1.Text.Trim();
SQLCommand.Parameters.Add("@tel", SqlDbType.NVarChar, 50).Value = textBox2.Text.Trim();
SQLCommand.ExecuteNonQuery();



حال باید در این قسمت چه کدی بنویسم ؟؟؟؟




private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
}
؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
{


البته اینو بگم که با انتقال مقادیر تکست مشکل ندارم

seven7777777
چهارشنبه 24 تیر 1388, 08:22 صبح
سلام
با کد زیر به راحتی به هدفت میرسی :


//Initialize image variable
Image newImage;
//Read image data into a memory stream
MemoryStream ms = newMemoryStream(picbyte, 0, picbyte.Length);
ms.Write(picbyte, 0, picbyte.Length);
newImage = Image.FromStream(ms, true);
return newImage;

در کد بالا newImage یک Image است که می تونی به راحتی با کدی مثل
PictureBox.Image = newImage; به چیزی که می خوای برسی .
راستی PicByte همون بایت های عکسمه که از DB واکشی کردم .

debugger
چهارشنبه 24 تیر 1388, 09:36 صبح
مشکل اینجاست که من چطوری PicByte را از دیتا بیس واکشی کنم . در کد شما کامپایلر میگه محتویات picbyte قابل کانورت به بایت نیست . من از هر نوعی تعریفش می کنم جواب نمیده

خودم این کد ها را نوشتم



byte[] arrPic = (byte[])(dataGridView1[3, index].Value.ToString());
MemoryStream ms = new MemoryStream(arrPic);
pictureBox1.Image = Image.FromStream(ms);

این ارور را به این کد میده :

byte[] arrPic = (byte[])(dataGridView1[3, index].Value.ToString());


Error 22 Cannot convert type 'string' to 'byte[]'

seven7777777
چهارشنبه 24 تیر 1388, 10:26 صبح
مجددا سلام
من یک کلاس دارم به نام member و داخل اون متغیری از نوع byte[] دارم به نام pic .
حالا وقتی که با Query مقدار بایت های عکس رو از دیتابیس واکشی کردم اینجوری اونو میریزم توی متغیر عکس داخل کلاسم :


member.pic = (byte[])getReader.GetValue(0);

seven7777777
چهارشنبه 24 تیر 1388, 10:37 صبح
یه سوال : شما دیتا گرید رو bind کردی ؟؟؟

یه نکته : ردیف هات معمولا چندتاست و چندتاشو ممکنه که کلیک بشن تا عکسشون رو نمایش بدی ؟ اگه تعداد ردیف ها زیاده و تعداد ردیف هایی که کلیک میشن کمه ، حتما واکشی عکس رو بذار وقتی که روی یه ردیف کلیک شد ، چون اینجوری اطلاعات بیهوده زیادی رو واکشی میکنی که خیلی سنگین میشه و برنامت شاید کند بشه ...

یه سر نخ : اگه تبدیل نکرد ، اول String رو به Object تبدیل کن و بعد Object رو به byte[] . البته من امتحان نکردم ، ببین میشه یا نه !!!

Soroush.Sarabi
چهارشنبه 24 تیر 1388, 11:24 صبح
دوست عزیز نوع داده ای SQL رو برای تصویر چی گرفتی؟

(http://soroush-sarabi.blogspot.com)

debugger
چهارشنبه 24 تیر 1388, 11:55 صبح
Data Type عکس از نوع varbinary max هست

من سورس را آپلود می کنم . لطفا سورس را دانلود کنید و اون تیکه را نگاه کنید

سورس کامل هست

دیتا بیس را خودتون تو sql بسازین نام دیتا بیس test هست و نام table هم tb1 هست

seven7777777
چهارشنبه 24 تیر 1388, 16:31 عصر
یعنی مشکلت حل نشد ؟؟؟:متعجب:

من نتونستم متاسفانه برنامت رو باز کنم با VS2008 بود مگه ؟؟؟

به هر حال انشاالله بچه ها بتونن کمکت کنن ، منم اگه شد یه نمونه برنامه میذارم !!!:لبخندساده:

alireza1384
چهارشنبه 24 تیر 1388, 17:16 عصر
1.فیلد تصویردربانک را ازنوع image درنظربگیر
2. تصویرموردنظررا به صورت آرایه ای ازبایتها دربانک ذخیره کن. (همانگونه که تاکنون انجام می دادی )
با دستورات زیر:
PsqlCommand.Parameters.Add("@Photo", SqlDbType.Image).Value = MyEntity.Photo.ToArray();
3. درزمان خواندن اطلاعات ازبانک به روش زیر تصویررا به شکل آرایه ای از بایتها ازبانک استخراج کن و زمانی که کاربر برروی گرید مورد نظر کلیک می کند با دستور زیر تصویر را بدست بیاور :

byte[] imgBufer = (byte[])dgPersonal[FName.Photo, RowIndex].Value;
MyEntity.Photo = new MemoryStream(imgBufer);

4. تصویر مورد نظررا با دستور زیر به شکل image درآورده و نمایش بده :
Image PPic = Image.FromStream(MyEntity.Photo);
personPic.Image = PPic;

نکته : MyEntity.Photo ازنوع object می باشد .

seven7777777
چهارشنبه 24 تیر 1388, 21:42 عصر
من فکر کنم مشکل دوست خوبم debugger (http://barnamenevis.org/forum/member.php?u=63639) رو فهمیدم .

ایشون بعد از واکشی اطلاعات از دیتابیس اونها رو به Grid بایند میکنه . بعد وقتی می خواد اونو بخونه وتبدیل به byte[] کنه به مشکلی که میگه برمیخوره .

نمی دونم از روشی که من گفتم مشکلت حل شد یا نه ولی می تونی یه کار دیگم بکنی اونم اینه که قبل از Bind کردن تبدیلو انجام بدی و بعد عمل Bind رو انجام بدی .

debugger
پنج شنبه 25 تیر 1388, 07:43 صبح
روش علیرضا خوبه ولی تعداد رکورد های من زیاده اگر از نوع image ذخیره کنم . حجم دیتا بیس خیلی زیاد میشه

به صورت باینری ذخیره می کنم تا حجم بالا نره

در مورد Bind کردن من اصلا بایند نمی کنم. کد های سورس را نگاه کنید. ولی اون تبدیلی که گفتی را هنوز انجام ندادم تست می کنم نتیجه را میگم

راستی اگر تونستین تغییرات در سورس اعمال کنین . اونجا بهتر قابل درکه

cactoss84
چهارشنبه 21 مرداد 1388, 07:10 صبح
سلام من یه فایل tif رو تویsql ذخیره میکنم و روی فرم برنامه تویه picturebox بازیابیش میکنم و سرعتش خیلی پایین راهی هست واسه بالا بردن سرعت لود شدن عکس ها؟؟؟

aminicompeng
شنبه 16 آبان 1388, 12:41 عصر
با سلام ، دوست من بنظر بنده این کد بایستی در رویداد dataGridView1_SelectionChanged نوشته شود:
کد:


private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
{
MemoryStream ms;
byte[] picArr = (byte[])(dataGridView1.CurrentRow.Cells["Picture_01"].Value);
ms = new MemoryStream(picArr);
pictureBox1.Image = Image.FromStream(ms);
ms.Close();
//*******
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
//throw;
}
}